在EditText中显示密码的最后一个字符

时间:2011-12-22 08:19:45

标签: android passwords android-edittext

我有一个应用程序,人们需要使用密码登录。我想只显示输入的最后一个字符,但我似乎得到的只是所有字符点或所有字符都可见。

我尝试了一些事情:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

并在xml中设置inputtype。

我只测试了一个星系s2,因为那是我办公室目前唯一的Android设备,所以我不知道问题是否仅适用于我的设备。

编辑: 刚刚从一位同事的HTC Sensation上进行了测试,它确实可以在他的手机上正常工作,但问题仍然是如何在Galaxy S2上做同样的事情?

3 个答案:

答案 0 :(得分:16)

这被问到已经差不多1。5年了:P。但我有同样的要求,并成功地实现了它。将MyTransformation类的对象作为setTransformationMethod中的参数传递,你很高兴:)这是代码。

public class MyTransformation extends PasswordTransformationMethod{

    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }

    private class PasswordCharSequence implements CharSequence {
        private CharSequence mSource;
        public PasswordCharSequence(CharSequence source) {
            mSource = source; // Store char sequence
        }
        public char charAt(int index) {
        //This is the check which makes sure the last character is shown
            if(index != mSource.length()-1)
                return '•';
            else
                return mSource.charAt(index);
        }
        public int length() {
            return mSource.length(); // Return default
        }
        public CharSequence subSequence(int start, int end) {
            return mSource.subSequence(start, end); // Return default
        }
    }
}

enter image description here

答案 1 :(得分:1)

改进AndyFaizan的答案,我的解决方案在使用退格时不会显示字符。 如果没有这个(简单的)更改,可以通过删除输入末尾的字符来显示整个密码。

public class CustomPasswordTransformation extends PasswordTransformationMethod {
    boolean lastActionWasDelete = false;

    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        super.onTextChanged(s, start, before, count);
        this.lastActionWasDelete = before > count;
    }

    private class PasswordCharSequence implements CharSequence {
        private CharSequence source;

        PasswordCharSequence(CharSequence source) {
            this.source = source;
        }

        public char charAt(int index) {
            //This is the check which makes sure the last character is shown
            if (!lastActionWasDelete && index == source.length() - 1) return source.charAt(index);
            return '•';
        }

        public int length() {
            return source.length(); // Return default
        }

        public CharSequence subSequence(int start, int end) {
            return source.subSequence(start, end); // Return default
        }
    }
}

答案 2 :(得分:0)

ethan早已提到,用户可以在系统安全设置中切换密码字符显示行为。

要隐藏密码,只需使用

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

其余部分由操作系统处理。

就我而言,我想知道各种设备上的不同行为。 经过一番调查后,未显示最后一个字符的设备上的安全设置“可见密码”被关闭了。

如果您必须忽略系统范围的设置,那么AndyFaizan的密码转换解决方案仍然是可行的方法。