android密码字段问题,没有隐藏最后输入的字符

Joe*_*oel 6 android android-edittext

在Android中,我创建了一个密码字段,如下所示:

    EditText text = new EditText(context);
    text.setTransformationMethod(PasswordTransformationMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)

或者像这样,这似乎做同样的事情:

    EditText text = new EditText(context);
    text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Run Code Online (Sandbox Code Playgroud)

除了用户输入的最后一个字符外,我得到一个不错的密码字段.在用点掩盖之前,它在屏幕上可见几秒钟.

这是一个截图: 在此输入图像描述

你知道如何解决这个问题吗?

Ste*_*ice 11

这是预期的行为.使用大多数设备上的软键盘,他们正确输入密码是有价值的反馈.

有关您可以指定的所有不同inputType的列表以及它们如何更改EditText,

看到android inputTypes.

此外,可以通过实现自己TransformationMethod并通过设置来改变此行为setTransformationMethod(),但我不建议这样做.用户会期望您看到的行为,通过更改您的应用,您将提供不一致的用户体验.

还检查这篇Android文章

  • 这也发生在其他移动智能手机/平板电脑平台上,例如iOS.对于大多数用户来说,这确实是一种标准的预期行为. (2认同)

chi*_*iik 10

TransformationMethod的实现隐藏了输入密码的最后一个char:

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));
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)