我想在输入时将编辑文本中的每个单词标题化。
我的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没有停止。这样它就可以持续执行。任何人帮我解决我的问题。我想把每一个字都弄清楚。请建议任何解决方案。
答案 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)
}
}
})
}