14

我在我的 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>

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

4

10 回答 10

20

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

所以这是我的解决方案。

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();
        }
    }
});

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

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

你可以return ...像这样替换它:

return String.valueOf(source).toLowerCase().replace(" ", "");

您可以允许或拒绝单个字符的相同方式。
此示例将 alleE替换为3

return String.valueOf(source).replace("e", "3").replace("E", "3");

等等。

我希望这可以帮助别人。

于 2017-05-01T15:12:31.890 回答
10

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

于 2012-04-04T14:05:34.697 回答
8

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

最好的解决方案是创建一个 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
    }
}

并且会像这样使用:

editText.filters = arrayOf(AllLowerInputFilter())
于 2018-10-30T21:01:40.317 回答
6

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()
        })
于 2019-09-17T22:49:35.910 回答
5

尝试 ,

android:digits="qwertyuiopasdfghjklzxcvbnm"
于 2013-10-03T13:34:14.500 回答
5

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

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

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

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

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

于 2012-04-04T13:17:45.250 回答
2

如果你想让第一个字符变小

android:inputType="text"
于 2020-01-23T12:33:45.457 回答
0

提供我的Kotlin解决方案

editText.filters = arrayOf(
        yourFilter01(), // if you have
        yourFilter02(),  // if you have
        InputFilter { source, _, _, _, _, _ ->
            source.toString().toLowerCase()
        }
)

于 2020-02-07T11:04:23.967 回答
0

我的解决方案:如果android:inputType设置为,"textPassword"那么一切都是小写的。所以如果它设置为"textVisiblePassword"那么一切都是小写的。

于 2020-11-15T13:33:46.720 回答
0

基于@THEPATEL 的回答并丢弃 AllCaps 类,这是一个更紧凑的版本(前提是您使用 Java 8):

editText.setFilters(new InputFilter[] {
            (src, start, end, dest, dstart, dend) -> src.toString().toLowerCase()
    });
于 2021-02-03T16:58:25.117 回答