【问题标题】:First letter capitalization for EditTextEditText 的首字母大写
【发布时间】:2011-06-16 01:46:43
【问题描述】:

我正在开发一个小型个人待办事项列表应用程序,到目前为止一切都运行良好。我想弄清楚一个小怪癖。每当我去添加一个新项目时,我都会有一个对话框,里面显示一个 EditText 视图。当我选择 EditText 视图时,键盘会按原样输入文本。在大多数应用程序中,默认值似乎是第一个字母的 shift 键......尽管在我看来它并没有这样做。必须有一种简单的方法来修复,但我反复搜索了参考资料,但找不到它。我在想适配器加载的引用必须有一个 xml 属性,但我不知道它是什么。

【问题讨论】:

    标签: android android-edittext


    【解决方案1】:

    静态(即在您的布局 XML 文件中):在您的 EditText 上设置 android:inputType="textCapSentences"

    以编程方式:您必须在EditTextInputType 中包含InputType.TYPE_CLASS_TEXT,例如

    EditText editor = new EditText(this); 
    editor.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
    

    可以结合文本及其变体来请求每个句子的第一个字符大写。

    - Google Docs

    【讨论】:

    • testEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);或 android:inputType="textCapSentences" 仅在您的设备键盘启用自动大写设置时才有效。
    • 为什么启用此功能会导致我的android:lines="7" 不再显示 7 行(它现在默认为 1 行)
    • estEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);或 android:inputType="textCapSentences" 仅在您的设备键盘启用自动大写设置时才有效。 有什么替代方案,以编程方式?
    • @JamesWierzba 我将在这里引用 Shivang 的答案作为对多线支持的响应。添加 android:inputType="textCapSentences|textMultiLine"
    • 使用 android:inputType="text|textMultiLine|textCapSentences" 允许多行文本
    【解决方案2】:

    只需在 EditText 元素中使用 android:inputType="textCapWords"

    例如:

    <EditText
        android:id="@+id/txtName"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight="0.7"
        android:inputType="textCapWords"
        android:textColorHint="#aaa"
        android:hint="Name Surname"
        android:textSize="12sp" />
    

    参考以下链接: http://developer.android.com/reference/android/widget/TextView.html#attr_android%3ainputType

    【讨论】:

    • 最好在代码元素中标记代码而不是加粗。
    • 这个答案并不能真正帮助 OP 的问题。这将大写每个 word 的第一个字符,而不是输入文本的第一个字符(假定为一个句子)。虽然这可能对其他人有所帮助,但正确答案是公认的答案。
    【解决方案3】:

    在 XML 中的 EditText 中应用以下行。

    android:inputType="textCapSentences|textMultiLine"
    

    它还将允许多行支持。

    【讨论】:

    • 这应该是一个可以接受的答案,因为这是唯一不会将 EditText 折叠成单行的解决方案
    【解决方案4】:
    testEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   
    

    android:inputType="textCapSentences" 仅在您的设备键盘启用自动大写设置时才有效。

    【讨论】:

    • 谢谢,我被卡住了,因为我刚刚禁用了设备键盘自动大写设置
    【解决方案5】:

    我遇到了同样的问题,只是分享我的发现。可能会对您和其他人有所帮助...

    在你的布局上试试这个。在你的EditText 中添加下面的行。

    android:inputType="textCapWords|textCapSentences"
    

    对我有用..希望它也对你有用...

    【讨论】:

      【解决方案6】:

      要大写,您可以对编辑文本执行以下操作:

      每个单词的首字母大写

      android:inputType="textCapWords"
      

      每个句子的首字母大写

      android:inputType="textCapSentences"
      

      每个字母都大写:

      android:inputType="textCapCharacters"
      

      但这只会对键盘进行更改,用户可以更改模式以小写字母书写。

      所以如果你真的想要大写格式的数据,这种方法不太受欢迎,首先添加以下类:

      public class CapitalizeFirstLetter {
          public static String capitaliseName(String name) {
              String collect[] = name.split(" ");
              String returnName = "";
              for (int i = 0; i < collect.length; i++) {
                  collect[i] = collect[i].trim().toLowerCase();
                  if (collect[i].isEmpty() == false) {
                      returnName = returnName + collect[i].substring(0, 1).toUpperCase() + collect[i].substring(1) + " ";
                  }
              }
              return returnName.trim();
          }
          public static String capitaliseOnlyFirstLetter(String data)
          {
              return data.substring(0,1).toUpperCase()+data.substring(1);
          }
      }
      

      然后,

      现在每个单词都大写:

      CapitalizeFirstLetter.capitaliseName(name);
      

      只大写第一个单词:

      CapitalizeFirstLetter.capitaliseOnlyFirstLetter(data);
      

      【讨论】:

        【解决方案7】:

        如果您希望每个单词的首字母大写,请使用android:inputType="textCapWords"

        为了更好的理解

         <EditText
            android:id="@+id/edt_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textCapWords"/>
        

        如果每个句子都大写,那么就使用它。 android:inputType="textCapSentences" xml 中的这一行。我的意思是在你的 EditText 中。

        为了更好的理解

        <EditText
            android:id="@+id/edt_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textCapSentences"/>
            
        

        【讨论】:

          【解决方案8】:

          对于 EditText 中的大写,您可以选择以下两种输入类型:

          1. android:inputType="textCapSentences"
          2. android:inputType="textCapWords"

          textCapSentences
          这将使每个句子中第一个单词的第一个字母为大写。

          textCapWords 这将使每个单词的第一个字母为大写。

          如果你想要这两个属性,只需使用 |用这两个属性签名

          android:inputType="textCapSentences|textCapWords"
          

          【讨论】:

            【解决方案9】:

            我可以向你保证,两个答案都会使首字母大写,并且不会使 edittext 成为单行。

            如果你想在 XML 中做,下面是代码

            android:inputType="textCapWords|textCapSentences"
            

            如果想在下面的活动/片段等中执行代码

            momentTextView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_MULTI_LINE)
            

            PS:如果您没有其他属性,您也可以使用管道“|”轻松添加它符号,只要确保属性属性之间的 xml 中没有空格

            【讨论】:

              【解决方案10】:

              在您的布局 XML 文件中:

              • 设置android:inputType="textCapSentences"

              • 在您的EditText 上将每个句子的第一个单词的第一个字母作为大写

              • android:inputType="textCapWords" 在 EditText 上将每个单词的首字母作为大写

              【讨论】:

                【解决方案11】:

                试试这个代码,它将所有单词的第一个字符大写。

                - 为 EditText 视图设置 addTextChangedListener

                edt_text.addTextChangedListener(watcher);

                - 添加TextWatcher

                TextWatcher watcher = new TextWatcher() {
                    int mStart = 0;
                
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }
                
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        mStart = start + count;
                    }
                
                    @Override
                    public void afterTextChanged(Editable s) {
                        String input = s.toString();
                        String capitalizedText;
                        if (input.length() < 1)
                            capitalizedText = input;
                        else if (input.length() > 1 && input.contains(" ")) {
                            String fstr = input.substring(0, input.lastIndexOf(" ") + 1);
                            if (fstr.length() == input.length()) {
                                capitalizedText = fstr;
                            } else {
                                String sstr = input.substring(input.lastIndexOf(" ") + 1);
                                sstr = sstr.substring(0, 1).toUpperCase() + sstr.substring(1);
                                capitalizedText = fstr + sstr;
                            }
                        } else
                            capitalizedText = input.substring(0, 1).toUpperCase() + input.substring(1);
                
                        if (!capitalizedText.equals(edt_text.getText().toString())) {
                            edt_text.addTextChangedListener(new TextWatcher() {
                                @Override
                                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                
                                }
                
                                @Override
                                public void onTextChanged(CharSequence s, int start, int before, int count) {
                
                                }
                
                                @Override
                                public void afterTextChanged(Editable s) {
                                    edt_text.setSelection(mStart);
                                    edt_text.removeTextChangedListener(this);
                                }
                            });
                            edt_text.setText(capitalizedText);
                        }
                    }
                };
                

                【讨论】:

                  【解决方案12】:

                  像这样在 XML 和 JAVA 文件中设置输入类型,

                  在 XML 中,

                  android:inputType="textMultiLine|textCapSentences"

                  它还将允许多行和在 JAVA 文件中,

                  edittext.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
                  

                  确保您的键盘的自动大写设置为已启用

                  【讨论】:

                    【解决方案13】:

                    将此代码仅用于 EditText 的首字母大写

                    MainActivity.xml

                    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                        xmlns:app="http://schemas.android.com/apk/res-auto"
                        xmlns:tools="http://schemas.android.com/tools"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent">
                    
                        <EditText
                            android:id="@+id/et"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:tag="true">
                        </EditText>
                    
                    </RelativeLayout>
                    

                    MainActivity.java

                    EditText et = findViewById(R.id.et);
                            et.addTextChangedListener(new TextWatcher() {
                                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                                }
                    
                                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
                                {
                                    if (et.getText().toString().length() == 1 && et.getTag().toString().equals("true"))
                                    {
                                        et.setTag("false");
                                        et.setText(et.getText().toString().toUpperCase());
                                        et.setSelection(et.getText().toString().length());
                                    }
                                    if(et.getText().toString().length() == 0)
                                    {
                                        et.setTag("true");
                                    }
                                }
                    
                                public void afterTextChanged(Editable editable) {
                    
                                }
                            });
                    

                    【讨论】:

                      【解决方案14】:

                      我创立了我的解决方案: 你有两种方法来解决它 在java中:

                       testEditText.setInputType(InputType.TYPE_CLASS_TEXT 
                       | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   
                      

                      和xml:

                       <EditText
                      android:id="@+id/mytxt"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:inputType="textCapWords"
                      android:textSize="12sp" />
                      

                      【讨论】:

                        【解决方案15】:

                        以前它曾经是 android:capitalize="words",现在已弃用。推荐的替代方法是使用android:inputType="textCapWords"

                        请注意,这仅在您的设备键盘自动大写设置启用时才有效。

                        要以编程方式执行此操作,请使用以下方法:

                        setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);

                        【讨论】:

                          【解决方案16】:

                          以编程方式

                          TextView firstline = (TextView) findViewById(R.id.firstline);
                          firstline.setAllCaps(true);
                          

                          【讨论】:

                            【解决方案17】:

                            如果您在styles.xml 中编写样式,那么

                            移除 android:inputType 属性并添加以下行

                            <item name="android:capitalize">words</item>
                            

                            【讨论】:

                              猜你喜欢
                              • 2018-06-14
                              • 2018-01-16
                              • 2014-09-16
                              • 1970-01-01
                              • 2021-07-29
                              • 2011-05-14
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多