将edittext字段设置为密码?

时间:2011-04-18 23:17:47

标签: android

android:password="true"

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

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

2 个答案:

答案 0 :(得分:4)

我认为这种行为是有意的,因为Android用于带有小键盘(物理和屏幕)的智能手机上,很容易造成错字。短暂地显示这封信是为了让用户可以看到他们输入了什么错误,而不是隐藏它并且在他们收到“密码错误,您的帐户现已被锁定”类型错误之前一直不知道!

我相信android:password =“true”会将TransformationMethod指定给文本字段,该字段负责将文本转换为点。我不是Android开发人员,但是从阅读documentation我可以想象这个TransformationMethod在afterTextChanged回调中有延迟。您可以尝试编写自己的TransformationMethod并使用它来查看是否可以创建自己的密码掩码版本而不是使用内置密码掩码。

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

答案 1 :(得分:0)

在编写密码时实现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));
        }
    }
}
}