在Android EditText中,如何强制大写?


144

在我的Android应用程序EditText中,用户可以在何处输入信息。但是我需要强迫用户以大写字母书写。您知道执行此操作的功能吗?

Answers:


340

Android实际上为此具有内置的InputFilter

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

要小心,setFilters 将重置所有其他属性这是通过XML设置(即maxLinesinputTypeimeOptinos...)。为防止这种情况,请将您的过滤器添加到现有过滤器中。

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

4
好的,伙计们是对的,我更新了答案。感谢您帮助改善这一点!!
ErlVolton 2014年

4
为了避免覆盖您在xml上设置的过滤器(例如maxLength),请尝试将追加InputFilter.AllCaps()editText.getFilters数组。见stackoverflow.com/a/18934659/3890983
tropicalfish

21
或者只是在科特林editText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov

4
更好的是:editText.filters += InputFilter.AllCaps()Kotlin很棒!<3
Milack19年

123

如果要强制用户默认在EditText 中使用大写字母,则只需添加即可android:inputType="textCapCharacters"。(用户仍然可以手动更改为小写字母。)


39
没有什么可以阻止用户按下“ Shift”并写小写字母。
Fernando Leal 2014年

同意费尔南多(Fernando)的意见,尽管它确实将键盘默认为大写字母,但不需要大写字母。
pforhan 2015年

用户可以使用Shift键输入小写字母,如@Fernando所说-Ajinkya
2016年

24

将设置input typeTYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS。本keyboard应履行这一点。


android:inputType =“ textCapCharacters”
Parth Kapoor

18

您可以使用两种方式。

第一种方式:

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

第二种方式:

当用户输入数字时,您必须使用文本监视程序并将小写字母更改为大写字母。

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

2
您的解决方案不起作用,因为它以相反的顺序设置了字符串。
co2f2e

您第一次或第二次使用哪种方式。
哈希德

第一个根本不起作用。第二个使文本大写,但是我们必须以编程方式将光标设置在句子的末尾。
co2f2e

@Kalanamith ya然后出了什么问题
Harshid

6
对于首选的textCapSentences大写句子,您需要textCapCharacters。
Ghoti 2014年

13

您可以将android:textAllCaps="true"属性添加到EditText中的xml文件中。这将强制软输入键盘以全大写模式显示。输入的值将以大写形式显示。但是,这不能确保用户只能输入UpperCase字母。如果需要,它们仍然可以使用小写字母。如果要确保的输出Edittext在大写形式下,则必须使用class toUpperCase()方法手动转换输入的String String


@GustavoAlves,您能告诉我尝试此操作时发生了什么吗?也许我可以调查您的问题。:)
Abhishek

嗨@Abhishek 设置属性没有任何改变。EditText仍然接受大写和小写字符。
Gus Costa

1
是的,如果您只想将EditText限制为仅接受大写字符,那么android:inputType =“ textCapCharacters”是正确的选择。试试看,然后让我知道。☺️
阿布舍克

1
每次输入时,这都会导致索引超出范围异常。
Zapnologica

2
android:textAllCaps="true"只是TextView的属性(stackoverflow.com/a/28803492/5268730)。使用android:inputType="textCapCharacters"代替。
woodii '18

11

您应该将android:inputType="textCapCharacters"Edittext放在xml文件中。


9
青山菜奈美写的答案完全一样。请专注于当前的更多问题,这个问题来自2013年。:)
ByteHamster

2
请注意,用户可以移动并输入小写字母
Rafa0809 '17

10

不用担心使用键盘,为什么不只接受任何输入(小写或大写)并将字符串转换为大写呢?

以下代码应有所帮助:

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

这是用户友好的,因为用户不必知道您需要大写的字符串。希望这可以帮助。


9

更妙的是... 一个班轮科特林 ...

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

做完了!


2
您可以使用属性访问语法来编写它: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan

8
更好的是:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan

9

kotlin中的.kt文件中进行更改:

edit_text.filters = edit_text.filters + InputFilter.AllCaps()

使用合成属性直接访问具有ID的小部件。在XML中,为您的编辑文本添加以下两个标志:

<EditText
    android:id="@+id/edit_text_qr_code"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...other attributes...
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
    />

这会将键盘更新为大写启用。


8

使用输入过滤器

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

6
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.getText().length());
    }
});  

6

只是这样做:

// ****** Every first letter capital in word *********
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textCapWords"
    />

//***** if all letters are capital ************

    android:inputType="textCapCharacters"

5

尝试使用以下任何代码都可以解决您的问题。

以编程方式:

editText.filters = editText.filters + InputFilter.AllCaps()

XML:

android:inputType="textCapCharacters" with Edittext

4

对我来说,它通过添加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"
                    />

3

要获得全部资本,请在XML中使用以下代码:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>

2
您是否尝试过此解决方案?当用户开始编辑editext的内容时,这会导致应用程序崩溃
surhidamatya


2

根据接受的答案,此答案的作用相同,但在Kotlin中。只是为了简化复制粘贴:·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}

1
filters += InputFilter.AllCaps():D
crgarridos

1

要在单击edittext时使用大写键盘,请在xml中使用此代码,

<EditText
    android:id="@+id/et"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:hint="Input your country"
    android:padding="10dp"
    android:inputType="textCapCharacters"
    />

1

我正在使用Visual Studio 2015 / Xamarin构建适用于Android 5.1和Android 6.0的应用程序(两者均安装了相同的APK)。

当我android:inputType="textCapCharacters"在axml中指定时,AllCaps键盘在Android 6.0上按预期出现,但在Android 5.1上没有出现。我将其添加android:textAllCaps="true"到axml中,但在Android 5.1上仍然没有AllCaps键盘。我使用设置了一个过滤器EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });,而软键盘在Android 5.1上显示小写字符时,输入字段现在为AllCaps。

编辑:我观察到并假定与操作系统相关的行为差异实际上是因为我在测试设备上安装了不同版本的Google键盘。 当我将设备更新为最新版的Google键盘(在撰写本文时已于2016年7月发布)后,“全大写”行为在所有操作系统上都是一致的。现在,所有设备在键盘上都显示小写字符,但是由于SetFilters(new IInputFilter[] { new InputFilterAllCaps() });


1
嗨,托尼,看来您已经创建了2个帐户;stackoverflow.com/users/6764633/tony-celiastackoverflow.com/users/6771440/deeveedee。如果要合并它们,请参见stackoverflow.com/help/merging-accounts
马特

谢谢,马特。将此内容与初学者/错误相提并论。直到您指出我才记得我创建了另一个帐户。幸运的是,帐户合并功能很简单。很棒的论坛!
托尼

1

Xamarin相当于ErlVolton的答案:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());

这就是为什么我喜欢C#如此简洁的原因。
莱昂内·陈18/12/25

1

简单的Kotlin实现

fun EditText.onlyUppercase() {
    inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
    filters = arrayOf(InputFilter.AllCaps())
}

PS对我filters来说一开始总是空的


0

提出的解决方案的Java 1-liner可以是:

editText.setFilters(Lists.asList(new InputFilter.AllCaps(), editText.getFilters())
    .toArray(new InputFilter[editText.getFilters().length + 1]));

注意它的需要com.google.common.collect.Lists


-1

只需将以下代码添加到xml文件的EditText中即可。

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

如果要同时允许大写字母和数字,请使用以下代码。

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

2
这可以肯定,但是并不是很好的用户体验。我只是尝试了一下,并且由于键盘没有自动大写(至少在N上),小写的键入字符被忽略而没有反馈给用户,因此UI似乎已损坏。
马特马特

完全同意@MattMatt。如果这样做,用户将无法键入小写字母。用户应该能够键入他/她想要的任何大小写,其余的应该自动将单词大写
Mir Adnan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.