将edittext字段设置为密码


android:password="true"

这将隐藏字母(****),但不会立即隐藏!当我输入字母时,需要一段时间才能隐藏。

例如,此刻我输入"a";它显示***a,然后变成****。我怎样才能立即改变它?

我相信这种行为是有意为之的,因为Android在智能手机上使用的是小键盘(物理键盘和屏幕键盘),很容易出现打字错误。简短地显示字母是为了让用户可以看到他们是否输入了错误,而不是隐藏它,直到他们得到"密码不正确,您的帐户现在已被锁定"类型错误才知道!

我认为android:password="true"给文本字段分配了一个TransformationMethod,负责将文本转换为点。我不是Android开发人员,但从阅读文档,我可以想象这个TransformationMethod有延迟内置到afterTextChanged回调。你可以试着写你自己的TransformationMethod,看看你是否可以创建你自己的密码屏蔽版本,而不是使用内置的。

请记住文档中关于避免无限循环的警告,因为更新文本可能会重新触发最初通知的事件。

TransformationMethod在输入密码时隐藏字母的实现:

public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // example of usage
    ((TextView) findViewById(R.id.password)).setTransformationMethod(new HiddenPassTransformationMethod());
}
private class HiddenPassTransformationMethod implements TransformationMethod {
    private char DOT = 'u2022';
    @Override
    public CharSequence getTransformation(final CharSequence charSequence, final View view) {
        return new PassCharSequence(charSequence);
    }
    @Override
    public void onFocusChanged(final View view, final CharSequence charSequence, final boolean b, final int i,
                               final Rect rect) {
        //nothing to do here
    }
    private class PassCharSequence implements CharSequence {
        private final CharSequence charSequence;
        public PassCharSequence(final CharSequence charSequence) {
            this.charSequence = charSequence;
        }
        @Override
        public char charAt(final int index) {
            return DOT;
        }
        @Override
        public int length() {
            return charSequence.length();
        }
        @Override
        public CharSequence subSequence(final int start, final int end) {
            return new PassCharSequence(charSequence.subSequence(start, end));
        }
    }
}
}

最新更新