在键入时将“编辑”文本中的每个单词大写

时间:2016-03-01 09:37:21

标签: java android android-edittext

我想在输入时将编辑文本中的每个单词标题化。

我的XML: -

<com.project.edittext.AutoFitEditText
                android:id="@+id/txt_name"
                style="@style/scan_text_fields_white_bg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:digits="@string/validation_accept_all_except_special_char"
                android:fontFamily="sans-serif"
                android:imeOptions="flagNoExtractUi|actionDone"
                android:inputType="textNoSuggestions|textCapWords"
                android:maxLength="50"
                android:paddingBottom="3dp"
                android:paddingLeft="12dp"
                android:paddingRight="0dp"
                android:paddingTop="0dp"
                android:singleLine="true"
                android:textColor="@color/orange"
                />

现在我正在使用

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

但问题是它在某些设备中无效。前LG平板电脑。所以我决定以编程方式执行此操作。

所以我使用以下代码。

public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub                   
                String mNameStr=s.toString();
                String finalStr="";
                if(!mNameStr.equals("")) {
                    String[] strArray = mNameStr.split("[\\s']");
                    if (strArray.length > 0) {
                        for (int i = 0; i < strArray.length; i++) {
                            finalStr+=capitalize(strArray[i]);
                        }
                        Logger.d("finalStr==> ", finalStr);
                    }
                }
                mName.setText(finalStr.toString());
            }



private String capitalize(final String line) {
        return Character.toUpperCase(line.charAt(0)) + line.substring(1);
    }

这里我的应用程序崩溃了。我在调试时发现了问题。问题是onTextChanged没有停止。这样它就可以持续执行。任何人帮我解决我的问题。我想把每一个字都弄清楚。请建议任何解决方案。

6 个答案:

答案 0 :(得分:1)

您的代码冻结的原因是setText一旦String prevString = "";被触发,就会触发。{/ p>

如果文字是相同的话,你必须找到一种方法来阻止它。

为此,您可以使用临时字符串存储prev值,并在每次触发事件时进行比较。这将使流程保持一致而不是循环。

afterTextChanged

String mNameStr = s.toString(); String finalStr = ""; if (!mNameStr.equals("")) { String[] strArray = mNameStr.split("[\\s']"); if (strArray.length > 0) { int i = 0; for (i = 0; i < strArray.length - 1; i++) { finalStr += capitalize(strArray[i]) + " "; } finalStr += capitalize(strArray[i]); Log.d("finalStr==> ", finalStr); } } if (!finalStr.equals(prevString)) { prevString = finalStr; editText.setText(finalStr.toString()); editText.setSelection(finalStr.length()); }

editText.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) {
            String string = s.toString();
            Log.d("STRING", string + " " + prevString);
            if (string.equals(prevString)) {
                return;
            } else if (string.length() == 0)
                return;
            // 1st character
            else if (string.length() == 1) {
                prevString = string.toUpperCase();
                editText.setText(string.toUpperCase());
                editText.setSelection(string.length());
            }
            // if the last entered character is after a space 
            else if (string.length() > 0 && string.charAt(string.length() - 2) == ' ') {
                string = string.substring(0, string.length() - 1) + Character.toUpperCase(string.charAt(string.length() - 1));
                prevString = string;
                editText.setText(string);
                editText.setSelection(string.length());
            }
        }
    });

对代码进行优化只是在最后输入的字母位于空格之后才将句子大写。你可以在这里看到它。

getSelectionEnd()

然而,上述方法存在缺点。这不会考虑更改光标位置并输入文本的情况。

PS:您可以使用CloseableHttpResponse response = client.execute(request); String content = CharStreams.toString(new InputStreamReader(response.getEntity().getContent())); 方法并增强上述方法

答案 1 :(得分:0)

在xml设计中执行此操作

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

来自this

的参考资料

修改

如果不能正常工作,请尝试此

android:capitalize="characters"

编辑xml中的文本。

来自this

的参考资料

答案 2 :(得分:0)

试试这个:

在XML中的Activated中添加以下内容:

<EditText ../>

答案 3 :(得分:0)

有一个afterTextChanged事件,当您的输入临时完成时,您应该尝试使用该方法。

答案 4 :(得分:0)

您可以根据需要使用以下任何一种(在.xml文件中)...

android:inputType="textCapCharacters"

android:inputType="textCapSentences"

android:inputType="textCapWords"

已弃用此标签,请不要使用此android:capitalize="characters"

答案 5 :(得分:0)

如果您正在寻找 Kotlin 代码来将 EditText 中的每个单词都变成大写。打字时会先改成大写。

 private fun handleFirstLatterCap() {
        var prevString = ""
        edittext.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
            override fun afterTextChanged(s: Editable) {
                var str = s.toString()
                if (str == prevString) {
                    return
                } else if (str.isEmpty()) return else if (str.length == 1) {
                    prevString = str.toUpperCase()
                    edittext.setText(str.toUpperCase())
                    edittext.setSelection(str.length)
                } else if (str.isNotEmpty() && str[str.length - 2] == ' ') {
                    str = str.substring(
                        0,
                        str.length - 1
                    ) + Character.toUpperCase(str[str.length - 1])
                    prevString = str
                    edittext.setText(str)
                    edittext.setSelection(str.length)
                }
            }
        })
    }