Android EditText 数据输入在运行时确定为小写



我很惊讶这不是EditText的本机函数,但我找不到任何机制可以在输入输入EditText字段时将输入转换为小写。EditText字段确定运行时是否为小写,所以我不能在XML中使用它,需要在分配EditText时触发它。我试过:

1( 否定所有大写字母:

 mEntry.setInputType(InputType.TYPE_CLASS_TEXT |  ~InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);

2( 创建监听器:

private TextWatcher

textWatcher = 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);
        }
    }
}

最新更新