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

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

【问题讨论】:

    标签: android android-edittext uppercase


    【解决方案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_width="fill_parent"
                              android:layout_height="@dimen/edit_text_height"
                              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_width="match_parent"
                    android:layout_height="wrap_content"
                    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_width="match_parent"
                    android:layout_height="wrap_content"
                    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_width="match_parent"
                      android:layout_height="wrap_content"
                      ...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 数组。见stackoverflow.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() });

                    【讨论】:

                    【解决方案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 (stackoverflow.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_width="250dp"
                        android:layout_height="wrap_content"
                        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());
                            }
                        });  
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-03-12
                          • 1970-01-01
                          • 2019-11-08
                          • 1970-01-01
                          • 2012-11-22
                          • 1970-01-01
                          • 2011-10-03
                          相关资源
                          最近更新 更多