我的尝试是这样的:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("qwer", "onTextChanged: " + s + " " + start + " " + before + " " + count);
String originalText = s.toString();
int originalTextLength = originalText.length();
int currentSelection = textHeading.getSelectionStart();
StringBuilder sb = new StringBuilder();
boolean hasChanged = false;
for (int i = 0; i < originalTextLength; i++) {
char currentChar = originalText.charAt(i);
if (isAllowed(currentChar) && i < 21) {
if (i == 0){
String str = "" + currentChar;
str.toUpperCase();
sb.append(str);
}
sb.append(currentChar);
} else {
hasChanged = true;
if (currentSelection >= i) {
textHeading.setError("Please insert current letters");
currentSelection--;
}
}
}
if (hasChanged) {
String newText = sb.toString();
textHeading.setText(newText);
textHeading.setSelection(currentSelection);
}
}
如您所见,我非常愚蠢地检查 i 索引并愚蠢地做了一个 apercase,但它没有按应有的方式工作。但需要用户在输入第一个字母后立即将第一个字母变为大写,然后即使输入大写,反之亦然。问题是,如果你在edittext中联网新数据,那么你会得到一个无限循环,因为监听器被触发并且onTextChanged方法被重新启动,等等无限循环。
一种不使用“textwatcher”的解决方案:在字段的标记中添加 - android:inputType="textCapWords"
可能适合?