如何小写可搜索项目的EditText中的文本?

rob*_*bsf 8 android

我在我的Android项目中使用了一个可搜索的项目和建议.它本质上是一个EditText

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search.hint" 
    android:includeInGlobalSearch="true"
    android:searchSettingsDescription="@string/search.hint"
    android:searchSuggestAuthority="com.xxx.android.provider.SearchSuggestionsProvider"
    android:searchSuggestSelection=" ?"
    android:inputType="text"
    android:imeOptions="actionSearch">
</searchable>
Run Code Online (Sandbox Code Playgroud)

当我开始输入时,它显示为首字母大写.为什么?我希望它从小写开始.可能吗?

ᴛʜᴇ*_*ᴛᴇʟ 15

我很惊讶这还没有一个好的答案.或许这是另一个我找不到的问题.

所以这是我的解决方案.

editText.setFilters(new InputFilter[] {
    new InputFilter.AllCaps() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            return String.valueOf(source).toLowerCase();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

editText无论如何,所有文本都将是小写的.

您可以随意修改字符串.
例如:您希望所有文本都是小写且不允许使用空格(假设它是电子邮件输入字段)

您可以将其替换return ...为:

return String.valueOf(source).toLowerCase().replace(" ", "");
Run Code Online (Sandbox Code Playgroud)

与允许或拒绝单个字符的方式相同.
此示例替换all eEwith 3.

return String.valueOf(source).replace("e", "3").replace("E", "3");
Run Code Online (Sandbox Code Playgroud)

等等.

我希望这可以帮助别人.

  • 我注意到,使用这段代码,通过按住“退格”按钮/键快速擦除文本时会出现故障。就像擦除文本“这是文本”时一样,擦除后会在末尾再次添加“ext”。 (2认同)

Raj*_*ran 9

如果您希望第一个字符在默认情况下为小写,则可以使用 - android:capitalize="none".然后,您需要手动单击按钮以大写第一个字符.否则请点击此链接.

  • 它已被弃用。使用输入类型。 (2认同)

mca*_*tro 7

不确定建议的答案是否有效,但我发现了一个影响我以前使用的解决方案的错误。在某些键盘(特别是三星键盘)中,当启用“智能文本”时,字符会重复。

最好的解决方案是创建一个 AllLowerInputFilter 类,我基本上改编自 Android 自己的 AllCaps 实现。它适用于我测试过的每个键盘,无论是否启用“智能文本”。

class AllLowerInputFilter : InputFilter {

    override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence? {

        for (i in start until end) {
            if (source[i].isUpperCase()) {
                val v = CharArray(end - start)
                TextUtils.getChars(source, start, end, v, 0)
                val s = String(v).toLowerCase()

                return if (source is Spanned) {
                    val sp = SpannableString(s)
                    TextUtils.copySpansFrom(source, start, end, null, sp, 0)
                    sp
                } else {
                    s
                }
            }
        }

        return null // keep original
    }
}
Run Code Online (Sandbox Code Playgroud)

并且会像这样使用:

editText.filters = arrayOf(AllLowerInputFilter())
Run Code Online (Sandbox Code Playgroud)


Boo*_*ger 5

有多种 inputType 选项,但没有一个专门用于保持文本小写。

您可能想在此处查看它们的完整列表:http : //developer.android.com/reference/android/widget/TextView.html#attr_android : inputType

我希望“textUri”会做你想做的。

在输入文本后,您始终可以在文本上使用 String.toLowerCase() 函数。

否则,您可以向 EditText 添加一个 TextWatcher,并根据您的特定条件验证每个输入事件。


LMK*_*LMK 5

试试吧,

android:digits="qwertyuiopasdfghjklzxcvbnm"
Run Code Online (Sandbox Code Playgroud)


Noe*_*lia 5

kotlin 中的解决方案:

editText.filters = arrayOf<InputFilter>(object : InputFilter.AllCaps() {
        override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int) = 
              source.toString().toLowerCase()
        })
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案存在缺陷。在某些手机中,您会看到整个单词的重复。 (2认同)