在Android的EditText中,如何强制输入大写字母?

186
在我的Android应用中,我有不同的EditText,用户可以在其中输入信息。但我需要强制用户使用大写字母进行书写。您知道一个能实现这个功能的函数吗?
27个回答

390

实际上,Android 内置了一个InputFilter 专门用于这个功能!

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});

请注意,setFilters 方法将重置通过 XML 设置的所有其他属性(例如 maxLinesinputTypeimeOptions 等)。为了防止这种情况,应该将您的筛选器添加到已经存在的筛选器中。

InputFilter[] editFilters = <EditText>.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;  
<EditText>.setFilters(newFilters);

3
没问题,这是最好的答案!代码应该是edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()}); - Arthur
4
好的,大家说得对,我更新了我的答案。感谢帮助我改进它! - ErlVolton
5
为了避免覆盖您在 XML 中设置的过滤器(例如 maxLength),请尝试将 InputFilter.AllCaps() 添加到 editText.getFilters 数组中。请参见 https://dev59.com/0GjWa4cB1Zd3GeqPoC1f#18934659。 - tropicalfish
39
在Kotlin中,只需将editText.filters = editText.filters + InputFilter.AllCaps()添加到EditText中即可将输入的文本全部转换为大写字母,不改变原意。 - Ilia Kurtov
22
更好的做法是:editText.filters += InputFilter.AllCaps() Kotlin太棒了!<3 - Milack27
显示剩余8条评论

139
如果您想在EditText中默认情况下强制用户以大写字母输入(用户仍然可以手动更改为小写),只需添加android:inputType="textCapCharacters"

49
用户可以按下“Shift”键并输入小写字母,没有任何阻止。 - Fernando Leal
同意 Fernando 的观点,虽然它默认将键盘切换为大写字母,但并不要求使用大写字母。 - pforhan
用户可以像@Fernando所说的那样使用Shift键输入小写字母。 - Ajinkya
这是一个很好的解决方案,可以强制用户以大写字母开始并继续输入。不强制他,他仍然可以选择从键盘输入小写字母。 - sud007

26

无法通过 XML 强制打开大写锁定键,第三方库也不能帮忙。你可以在接收端对文本使用 toUpper(),但在键盘端没有办法防止它。

你可以使用 XML 来设置键盘为大写锁定状态。

Java

你可以将 input_type 设置为 TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS。键盘应该会遵守这个设定。

Kotlin

android:inputType="textCapCharacters"


android:inputType="textCapCharacters"安卓:输入类型="文本大写字符" - Parth Kapoor
2
我真的不知道为什么这个答案有那么多赞。这个解决方案并没有避免用户禁用大写锁定键... - kuzdu
@kuzdu 由于键盘没有控制这个的API,特别是第三方键盘没有,所以没有办法防止这种情况。你可以在接收端对文本进行toUpper()操作,但无法在键盘端防止它。 - Gabe Sechan
是的,没错。所以我会把这个信息完全放到答案里... - kuzdu

24

你可以使用两种方法。

第一种方法:

在你的EditText上设置android:inputType="textCapSentences"

第二种方法:

当用户输入数字时,你需要使用TextWatcher并将小写字母更改为大写字母。

edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
         edittext.setSelection(edittext.length()); //fix reverse texting
      }
    }
});  

3
你的解决方案不起作用,因为它将字符串设置为反向顺序。 - 0x12
第一个根本不起作用。第二个将文本转换为大写,但我们必须通过编程将光标设置到句子的末尾。 - 0x12
@Kalanamith 那么问题是什么? - Harshid
Android已经为你做了某些事情,为什么还要通过编程来实现呢? - James Goodwin
6
对于第一个选项"textCapSentences",它是将句子首字母大写,你需要使用"textCapCharacters"来将字符首字母大写。 - Ghoti
显示剩余3条评论

16

使用输入过滤器

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

当我按下退格/删除按钮时,它会导致问题。 - Zohab Ali

15

更好的是...在Kotlin中用一行代码...

// gets your previous attributes in XML, plus adds AllCaps filter    
<your_edit_text>.setFilters(<your_edit_text>.getFilters() + InputFilter.AllCaps())

完成!


3
您可以使用属性访问语法来编写:<your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps() (意思是将 <your_edit_text> 的过滤器设置为当前过滤器加上 InputFilter.AllCaps() - Makotosan
12
更好的做法是: <your_edit_text>.filters += InputFilter.AllCaps()。 (说明:这段代码用于将用户输入的文本全部转换为大写字母) - Makotosan
只有这种方法对我起作用。非常感谢你。 - Aydın Ahmed

14
您可以在EditText的xml文件中添加android:textAllCaps="true"属性。这将强制软键盘以全大写模式出现,您输入的值将以大写字母显示。但是,这不会确保用户只能输入大写字母。如果他们愿意,仍然可以回到小写字母。如果您想确保EditText的输出为全大写,则必须使用String类的toUpperCase()方法手动转换输入的字符串。

@GustavoAlves,你能告诉我你尝试这个时发生了什么吗?也许我可以帮你解决问题。 :) - Abhishek
嗨@Abhishek。设置属性并没有改变任何东西。EditText仍然接受大小写字符。 - Gus Costa
1
如果你想限制EditText只接受大写字符,那么android:inputType = "textCapCharacters"将是正确的选项。试一试,然后告诉我。☺️ - Abhishek
1
每当我输入时,这会导致索引越界异常。 - Zapnologica
你能给我Java代码片段吗?其中你正在尝试从EditText获取String? - Abhishek
3
android:textAllCaps="true" 只是 TextView 的一个属性(https://dev59.com/kOo6XIcBkEYKwwoYGwUw#28803492)。请使用 android:inputType="textCapCharacters" 代替。 - woodii

13

您应该在xml文件中的EditText中加入android:inputType="textCapCharacters"


10
AoyamaNanami写了完全相同的回答。请关注更加当前的问题,这个问题是来自2013年的。 :) - ByteHamster
2
请注意,用户可以切换并输入小写字符。 - Rafa0809

12

不必担心如何处理键盘输入,为什么不接受所有的小写或大写输入并将字符串转换为大写呢?

以下代码应该有所帮助:

EditText edit = (EditText)findViewById(R.id.myEditText);
String input;
....
input = edit.getText();
input = input.toUpperCase(); //converts the string to uppercase

这是用户友好的,因为用户不需要知道你需要大写字符串。

希望这能有所帮助。

10

对我来说,它起作用的方法是添加android:textAllCaps="true"android:inputType="textCapCharacters"

<android.support.design.widget.TextInputEditText
                    android:layout_width="fill_parent"
                    android:layout_height="@dimen/edit_text_height"
                    android:textAllCaps="true"
                    android:inputType="textCapCharacters"
                    />

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