我很惊讶这不是EditText
的本机函数,但我找不到任何机制可以在输入输入EditText
字段时将输入转换为小写。EditText
字段确定运行时是否为小写,所以我不能在XML中使用它,需要在分配EditText
时触发它。我试过:
1( 否定所有大写字母:
mEntry.setInputType(InputType.TYPE_CLASS_TEXT | ~InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
2( 创建监听器:
private TextWatchertextWatcher = new TextWatcher(( {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!Utilities.stringIsBlank(mField.getFormat()) && Field.LOWER.equalsIgnoreCase(mField.getFormat())) {
if (!Utilities.stringIsBlank(s.toString()) && !s.toString().equals(s.toString().toLowerCase()) ) {
mEntry.setText(s.toString().toLowerCase());
mEntry.setSelection(start+1);
}
}
}
}
这样做的问题是,当我调用setText()
时,它会递归回onTextChange
事件,这会弄乱光标的位置,具体取决于它正在更改的内容。
有人有一个简单的解决方案,我不知何故错过了?
您可以使用过滤器。 下面是一个修改后的AllCaps过滤器,用于将所有内容转换为小写而不是大写。
/**
* This filter will lower case all the capitalized letters that are added
* through edits.
*/
public static class NoCapsFilter implements InputFilter {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (Character.isUpperCase(source.charAt(i))) {
char[] v = new char[end - start];
TextUtils.getChars(source, start, end, v, 0);
String s = new String(v).toLowerCase();
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(s);
TextUtils.copySpansFrom((Spanned) source,
start, end, null, sp, 0);
return sp;
}
else {
return s;
}
}
}
return null; // keep original
}
}
然后只需在您的EditText
上设置过滤器即可。
mEntry.setFilters(new InputFilter[]{new NoCapsFilter()});
像这样检查 if 语句中的文本
if(mEntry.getText().toString().equals( mEntry.getText().toString().toLowerCase() )
return;
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!Utilities.stringIsBlank(mField.getFormat()) && Field.LOWER.equalsIgnoreCase(mField.getFormat())) {
if (!Utilities.stringIsBlank(s.toString()) && !s.toString().equals(s.toString().toLowerCase()) ) {
if (mEntry.getText().toString().equals(mEntry.getText().toString().toLowerCase())return;
mEntry.setText(s.toString().toLowerCase());
mEntry.setSelection(start+1);
}
}
}