Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 键入时将编辑文本中的每个单词大写_Java_Android_Android Edittext - Fatal编程技术网

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

Java 键入时将编辑文本中的每个单词大写,java,android,android-edittext,Java,Android,Android Edittext,我想在打字时将编辑文本中的每个单词大写 private fun handleFirstLatterCap() { var prevString = "" edittext.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after:

我想在打字时将编辑文本中的每个单词大写

 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)
                }
            }
        })
    }
我的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"
                />
但问题是它在某些设备中不起作用。前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);
    }
public void onTextChanged(字符序列、int start、int before、int count){
//TODO自动生成的方法存根
字符串mNameStr=s.toString();
字符串finalStr=“”;
如果(!mNameStr.equals(“”){
字符串[]strArray=mNameStr.split(“[\\s']”);
如果(strArray.length>0){
对于(int i=0;i”,finalStr);
}
}
mName.setText(finalStr.toString());
}
私有字符串大写(最后一行字符串){
返回字符.toUpperCase(line.charAt(0))+行.substring(1);
}

我的应用程序崩溃了。我在调试时发现了问题。问题是ContextChanged没有停止。这样它就可以连续执行。有人帮我解决问题吗。我想把每个字都大写。请提出解决方案

在xml设计中这样做

<EditText
    android:id="@+id/txtName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="textCapWords" />
编辑xml中的文本


来自的参考请尝试以下内容:

在XML格式的
中添加以下内容:

android:textAllCaps="true"

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

代码冻结的原因是,
onChangeListener
会在您
setText
时立即触发

如果文本相同,您必须找到停止触发的方法

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

String prevString=”“


后文本更改中

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());
}
然而,上述方法有一个缺点。这不会考虑改变光标位置并输入文本的情况。


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

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

android:inputType="textCapCharacters"

android:inputType="textCapSentences"

android:inputType="textCapWords"

这是不推荐使用的,因此,如果您正在寻找Kotlin代码,以便将EditText中的word转换为大写,请不要使用此
android:capitalize=“characters”
。输入时,它将先变为大写

 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)
                }
            }
        })
    }

android:inputType=“textCapWords”如果其崩溃,则可能重复,然后附加异常thrownI的日志。我建议您改用
split(\\s+)
。另外,你能发布你的日志吗?崩溃问题是因为持续执行。如果我删除
mName.setText(finalStr)
它工作正常。因为如果我再次调用setText
onTextChanged
。所以它一次又一次地呼叫。我试过这个。它在特定设备中不起作用。我正在使用LG平板电脑。它在这个平板电脑中不起作用。运气不好:-(。我也会添加我的XML。android:capitale=“characters”不推荐我认为它会起作用。我会检查并让你知道@Uma Kanth..!!谢谢你Uma Kanth..:-)它工作得很好。。!!再次感谢。。!!
android:inputType="textCapCharacters"

android:inputType="textCapSentences"

android:inputType="textCapWords"
 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)
                }
            }
        })
    }