【问题标题】:How to forcefully making each word starts with capital in Editext - Option to make it smaller case should not be there in SoftKeyboard如何强制使每个单词在 Edittext 中以大写字母开头 - 软键盘中不应存在使其更小写的选项
【发布时间】:2018-05-29 09:08:43
【问题描述】:

我要求Edittext 的所有单词都应以大写字母开头。如果用户写成小写(单词的第一个字母),那么它也应该转换成Uppercase

到目前为止,我已经完成了如下布局:

 <EditText
             android:id="@+id/edGymName"                                       
             style="@style/LoginRegisterEditText"
             android:layout_marginTop="@dimen/size_10"
             android:layout_toLeftOf="@+id/txtStatusGymStatus"
             android:hint="@string/gym_tag"                           
          android:inputType="textPersonName|textCapWords|textNoSuggestions"
          android:maxLength="30" />

但是,我不想让用户用小写字母写单词的第一个字母。这是可行的,但用户可以在small case 中写入单词的第一个字母。如果我们强行不允许怎么办。

【问题讨论】:

标签: android android-edittext


【解决方案1】:

input type 设置为TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS.

android:inputType="textCapCharacters" 每个字符 android:inputType="textCapSentences" 用于句子 android:inputType="textCapWords" 每个字

【讨论】:

  • Sirji,我知道。但是,如果在撰写本文时用户将其更改为 Smaller case 怎么办?我不想让用户在撰写本文时将其缩小。
【解决方案2】:

使用它会起作用。

android:inputType="textCapSentences"

你的情况

<EditText
             android:id="@+id/edGymName"                                       
             style="@style/LoginRegisterEditText"
             android:layout_marginTop="@dimen/size_10"
             android:layout_toLeftOf="@+id/txtStatusGymStatus"
             android:hint="@string/gym_tag"               
             android:inputType="textCapSentences"
             android:maxLength="30" />

【讨论】:

  • Sirji,我知道。但是,如果在撰写本文时用户将其更改为 Smaller case 怎么办?我不想让用户在撰写本文时将其缩小。
【解决方案3】:

将输入类型改为输入类型为TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS。

 android:inputType="text|textCapCharacters"

或者来自java代码

 editText.setInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);

【讨论】:

  • Sirji,我知道。但是,如果在撰写本文时用户将其更改为 Smaller case 怎么办?我不想让用户在撰写本文时将其缩小。
【解决方案4】:

静态(即在您的布局 XML 文件中):设置

android:inputType="textCapSentences" on your EditText.

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

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

用户可以从软键盘手动更改文本大写来管理这种情况,您可以设置输入过滤器。 Android 为此提供了一个 AllCap 过滤器。

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

设置过滤器将重置您在清单中设置的其他一些属性。所以要小心它。就像您在 xml 中设置了 maxlenth 属性一样,那么在设置过滤器之后,您需要在运行时重置它,否则它将无法工作。下面是一个例子。

editText.setFilters(new InputFilter[] {new InputFilter.AllCaps(),new InputFilter.LengthFilter(40)});

所以最好的方法是阻止所有以前的过滤器,然后添加一个新的。

InputFilter[] oldFilters = editText.getFilters();
    InputFilter[] newFilters = new InputFilter[oldFilters.length + 1];
    System.arraycopy(oldFilters, 0, newFilters, 0, oldFilters.length);
    newFilters[oldFilters.length] = new InputFilter.AllCaps();
    editText.setFilters(newFilters);

【讨论】:

  • Sirji,我知道。但是,如果在撰写本文时用户将其更改为 Smaller case 怎么办?我不想让用户在撰写本文时将其缩小。
【解决方案5】:

这将强制从您的editText 重新输入您的整个文本/句子,并使单词的每个首字母大写:

String oldText = ""; //this must be outside the method where the addTextChangedListener on the editText is set. (Preferrably outside the onCreate())

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            if (editable.toString().length() > 0 &&
                    !editable.toString().equals(oldText)) {
                oldText = editable.toString(); //prevent infinite loop
                editText.setText(capitalizeFirstLetterWord(editable.toString()));
                editText.setSelection(editText.getText().length()); //set the cursor to the end of the editText
            }

        }
    });

方法调用:(我稍微修改了一下,参考链接)

    /**
     * reference: http://www.penguincoders.net/2015/06/program-to-capitalize-first-letter-of-each-word-in-java.html
     *
     * @param s sentence to be capitalize each first letter of each word
     * @return capitalized sentence
     */
    public static String capitalizeFirstLetterWord(String s) {
        StringBuilder cap = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            try {
                char x = s.charAt(i);
                if (x == ' ') {
                    cap.append(" ");
                    char y = s.charAt(i + 1);
                    cap.append(Character.toUpperCase(y));
                    i++;
                } else {
                    cap.append(x);
                }
            } catch (IndexOutOfBoundsException ignored) {

            }
        }

        //finally, capitalize the first letter of the sentence
        String sentence = cap.toString();
        if (sentence.length() > 0) {
            sentence = String.valueOf(sentence.charAt(0)).toUpperCase(); //capitalize first letter

            if (cap.toString().length() > 1) { //check if there's succeeding letters
                sentence += cap.toString().substring(1); //append it also
            }
        }

        return sentence;
    }

【讨论】:

  • 这个我试过了,我唯一遇到的小问题就是编辑文本的光标,不管你怎么放,更改文本后,光标会移动到结尾。如果您遇到任何其他问题,请告诉我,(如果这解决了您的大小写问题,这个问题也可以解决)
  • 在 oldText 中我可以在哪里做 getText() ?
  • 对不起?我无法理解你的问题。 getText() 方法仅在 editText 上可用。 oldText 只是一个字符串,只是为了避免无限循环。
  • 在我的情况下,我已经尝试和测试过了,我遇到的唯一小问题是编辑文本的光标,不管你把它放在哪里,在更改文本时,光标将移动到最后。让我知道您是否遇到了除此之外的任何其他问题,(如果这解决了您的大小写问题,这个问题也可以解决);;;根据您的评论...请。提供解决方案。
  • 其实不是“问题”,只是行为不同而已。这个方法解决了这个问题。我不知道为什么这里会投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2012-06-22
  • 1970-01-01
  • 2015-12-10
  • 2016-10-22
  • 2022-11-23
相关资源
最近更新 更多