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

Posted

技术标签:

【中文标题】在Android EditText中,如何强制写大写?【英文标题】:In Android EditText, how to force writing uppercase? 【发布时间】:2013-04-04 10:00:54 【问题描述】:

在我的 android 应用程序中,我有不同的EditText,用户可以在其中输入信息。但我需要强制用户用大写字母书写。 你知道这样做的功能吗?

【问题讨论】:

【参考方案1】:

2021:答案

如果您想从EditTextPreference 获得EditText,这是唯一的最新答案。

要更改EditText 的值或属性,您需要根据新的AndroidX Kotlin 设置setOnBindEditTextListener 回调。

findPreference<EditTextPreference>("key")?.setOnBindEditTextListener 
    it.filters = arrayOf<InputFilter>(InputFilter.AllCaps())

【讨论】:

【参考方案2】:

仅通过 XML 强制大写锁定是不可能的。第三方库也无济于事。您可以在接收端的文本上执行toUpper(),但无法在键盘端阻止它

您可以使用 XML 将键盘设置为大写锁定。

Java

您可以将input_type 设置为TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERSkeyboard 应该尊重这一点。

科特林

android:inputType="textCapCharacters"

【讨论】:

android:inputType="textCapCharacters" 我真的不知道为什么这个答案有这么多的赞成票。该解决方案并不能避免用户禁用大写锁定... @kuzdu 因为没有用于键盘的 API 来控制它,尤其是在 3rd 方键盘中,所以没有办法阻止它。您可以在接收端对文本执行 toUpper(),但无法在键盘端阻止它。 是的,没错。所以我会把这些信息准确地放在答案中......【参考方案3】:

简单的kotlin实现

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

PS 看来filters 一开始总是空的

【讨论】:

【参考方案4】:

试试这个代码,它会让你的输入变成大写

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

【讨论】:

【参考方案5】:

你可以使用两种方式。

第一种方式:

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

第二种方式:

当用户输入数字时,您必须使用文本观察器并将小写字母更改为大写字母。

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

【讨论】:

您的解决方案不起作用,因为它将字符串设置为相反的顺序。 你第一次或第二次使用的方式。 第一个根本不起作用。第二个使文本大写,但我们必须以编程方式将光标设置到句子的末尾。 @Kalanamith 是什么问题 对于第一个选项 textCapSentences 大写句子,你需要 textCapCharacters。【参考方案6】:

对我来说,它通过添加 android:textAllCaps="true"android:inputType="textCapCharacters"

起作用
<android.support.design.widget.TextInputEditText
                    android:layout_
                    android:layout_
                    android:textAllCaps="true"
                    android:inputType="textCapCharacters"
                    />

【讨论】:

【参考方案7】:

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

以编程方式:

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

XML:

android:inputType="textCapCharacters" with Edittext

【讨论】:

【参考方案8】:

建议的解决方案的 Java 1-liner 可能是:

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

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

【讨论】:

【参考方案9】:

要获得所有资本,请在您的 XML 中使用以下内容:

<EditText
    android:layout_
    android:layout_
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>

【讨论】:

你试过这个解决方案吗?当用户开始编辑editext的内容时,这会导致应用程序崩溃【参考方案10】:

Xamarin 相当于 ErlVolton 的回答:

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

【讨论】:

这就是为什么我喜欢 C# 如此简洁的原因。【参考方案11】:

这样做:

// ****** Every first letter capital in word *********
<EditText
    android:layout_
    android:layout_
    android:inputType="textCapWords"
    />

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

    android:inputType="textCapCharacters"

【讨论】:

【参考方案12】:

kotlin 中,在 .kt 文件中进行更改:

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

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

<EditText
    android:id="@+id/edit_text_qr_code"
    android:layout_
    android:layout_
    ...other attributes...
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
    />

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

【讨论】:

【参考方案13】:

Android 实际上有一个built-in InputFilter just for this!

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

【讨论】:

是的!这是最好的答案!代码应该是edittext.setFilters(new InputFilter[] new InputFilter.AllCaps()); 好的,你们是对的,我更新了我的答案。感谢您帮助改进! 为避免覆盖您在 xml 上设置的过滤器(例如 maxLength),请尝试将 InputFilter.AllCaps() 附加到 editText.getFilters 数组。见***.com/a/18934659/3890983 或者在 Kotlin 中只是 editText.filters = editText.filters + InputFilter.AllCaps() 更好的是:editText.filters += InputFilter.AllCaps() Kotlin 太棒了! 【参考方案14】:

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

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

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

【讨论】:

您好托尼,您似乎创建了 2 个帐户; ***.com/users/6764633/tony-celia 和 ***.com/users/6771440/deeveedee。如果要合并它们,请参阅***.com/help/merging-accounts。 谢谢,马特。将此归结为初学者的学习/错误。在您指出之前,我不记得我创建了另一个帐户。幸运的是,帐户合并功能很简单。很棒的论坛!【参考方案15】:

使用输入过滤器

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

【讨论】:

当我按下退格键/删除 btn 时会导致问题【参考方案16】:

更好...一个衬里Kotlin...

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

完成!

【讨论】:

您可以使用属性访问语法编写它:&lt;your_edit_text&gt;.filters = &lt;your_edit_text&gt;.filters + InputFilter.AllCaps() 更好:&lt;your_edit_text&gt;.filters += InputFilter.AllCaps() 只有这种方法对我有用。非常感谢。【参考方案17】:

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

【讨论】:

@GustavoAlves,你能告诉我你尝试这个时发生了什么吗?也许我可以调查你的问题。 :) 嗨@Abhishek。设置属性并没有改变任何东西。 EditText 仍然接受大写和小写字符。 是的,如果你想限制你的 EditText 只接受大写字符,那么对你来说,android:inputType = "textCapCharacters" 将是正确的选择。试一试,然后告诉我。 ☺️ 每次输入时都会导致索引越界异常。 android:textAllCaps="true" 只是 TextView (***.com/a/28803492/5268730) 的一个属性。请改用android:inputType="textCapCharacters"【参考方案18】:

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

【讨论】:

没有什么能阻止用户按下“shift”并写一个小写字母。 同意 Fernando,虽然它默认键盘为大写字母,但它不需要它们。 如@Fernando所说,用户可以使用shift键输入小写字母 这是一个很好的解决方案,可以强制用户开始并继续输入大写字母。不勉强他,反正他可以选择用键盘写成小写【参考方案19】:

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

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

【讨论】:

filters += InputFilter.AllCaps():D 天哪,那更好!谢谢@crgarridos!【参考方案20】:

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

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

如果您想同时允许大写文本和数字,请使用以下代码。

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

【讨论】:

这肯定行得通,但它不是一个很好的用户体验。我刚试了一下,由于键盘没有自动大写(至少在 N 上),小写输入的字符被忽略,没有给用户任何反馈,使 UI 看起来很糟糕。 完全同意@MattMatt。如果我们这样做,用户将无法输入小写字母。用户应该能够输入他/她想要的任何大小写,其余的应该自动大写单词【参考方案21】:

你应该把android:inputType="textCapCharacters"和Edittext放在xml文件中。

【讨论】:

AoyamaNanami 写了完全相同的答案。请关注更多当前的问题,这是 2013 年的问题。:) 注意用户可以移位和输入小写字符【参考方案22】:

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

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

【讨论】:

【参考方案23】:

与其担心处理键盘,为什么不接受任何输入,小写或大写,然后将字符串转换为大写?

以下代码应该会有所帮助:

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

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

【讨论】:

【参考方案24】:
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());
    
);  

【讨论】:

以上是关于在Android EditText中,如何强制写大写?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制EditText只接受数字?

android.widget.RelativeLayout无法强制转换为android.widget.EditText

如何强制editText框格式化缩进替换文本?

如何在 Android 中禁用 EditText

如何在 android 小部件 EditText 中添加水印?

如何在android中动态添加edittext?