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)
它工作正常。因为如果我再次调用setTextonTextChanged
。所以它一次又一次地呼叫。我试过这个。它在特定设备中不起作用。我正在使用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)
}
}
})
}