EditText中仅允许输入字母并将首字母大写

3

我需要一个EditText,只允许输入字母并自动将首字母大写。

为了只允许输入字母,我在XML布局中设置了属性android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ",它正常工作。然后,我也设置了属性android:inputType="textCapSentences"来自动将第一个字母大写,但是它没有生效。

只是想知道发生了什么,我尝试移除digits属性,然后textCapSentences属性就正常工作了。

问题是:我只能使用其中一个属性,而不能同时使用它们两个。我该如何解决?我需要编程解决吗?谢谢。

<EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "
        android:inputType="textCapSentences"
        android:hint="@string/et_hint" />

当你使用EditText中的值时,为什么不自己将第一个字母大写呢? - CommonsWare
@EliseoBaoSouto 你需要将每个单词都大写吗?还是每个新句子都要大写? - Denysole
@AlexeyDenysenko 我需要将第一个字符大写。我也尝试了 android:inputType="textCapWords" 但它的行为方式相同。 - Eliseo Bao Souto
@CommonsWare 我需要在输入时让EditText显示第一个字符为大写。 - Eliseo Bao Souto
我需要EditText在输入时显示第一个大写字母 -- 为什么? - CommonsWare
@CommonsWare 这是一个必需的条件。 - Eliseo Bao Souto
4个回答

1

我不知道这两个属性一起使用的情况,但如果其中一个单独使用可以解决问题,可以在您的EditText上使用textCapSentences,并编写一个文本过滤器,如下所示:

public static InputFilter[] myFilter = new InputFilter[] {
    new InputFilter() {
        public CharSequence filter(CharSequence source, int start, int end,
                                   Spanned dest, int dstart, int dend) {
            for (int i = start; i < end; i++) {
                if (!Character.isLetterOrDigit(source.charAt(i)) &&
                        source.charAt(i) != '@' &&
                        source.charAt(i) != '#') {
                    Log.i(TAG, "Invalid character: " + source.charAt(i));
                    return "";
                }
            }
            return null;
        }
    }
};

这个示例接受0-9、所有字母(大写和小写),以及字符@和#,仅作为示例。如果您尝试输入任何其他字符,它将返回“”,并且基本上会忽略它。

在初始化编辑文本时应用它:

    EditText editText = (EditText) findViewById(R.id.my_text);
    editText.setFilters(myFilter);

是的,我将 if 条件修改为过滤数字,它起作用了。谢谢! - Eliseo Bao Souto

1
保留textCapSentences属性,通过编程方式进行字母检查,如下所示:
et_name.setFilters(new InputFilter[] { filter }); 

InputFilter filter = new InputFilter() { 
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
    for (int i = start;i < end;i++) { 
        if (!Character.isLetter(source.charAt(0))) { 
            return ""; 
        } 
    } 
    return null; 
} 
}; 

0

您可以像这样使用多个值作为属性:android:inputType="textCapSentences|text" 希望这可以帮到您。


是的,但我认为不可能用这种方式过滤数字,而且这是必需的。 - Eliseo Bao Souto
尝试使用android:inputType="textPersonName" - Adnan Khan

0

如果你想让每个新单词大写,你应该使用另一个inputType:

 android:inputType="textCapWords"

如果你想要将每个新的句子的首字母大写,你可以在数字后面添加,这样可以帮助系统识别新的句子。这段内容与编程有关。
 android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. "

我尝试了一下,但对我来说不起作用。我不知道是否有什么遗漏。 - Eliseo Bao Souto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接