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

New*_*per 5 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"
                />
Run Code Online (Sandbox Code Playgroud)

现在我正在使用

mName.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
Run Code Online (Sandbox Code Playgroud)

但问题是它在某些设备中不起作用.前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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Uma*_*nth 2

您的代码冻结的原因是onChangeListener一旦您执行setText.

如果文本相同,您必须找到一种方法来停止触发。

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

String prevString = "";


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());
}
Run Code Online (Sandbox Code Playgroud)

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

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());
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

PS:可以使用getSelectionEnd()方法并增强上述方法