EditText密码明文暗文+以星号*显示

文章目录

  • 实现效果
    • 需要注意的细节
      • InputType对照表
    • InputType实现密码隐藏可见
    • 星号显示
    • 查看边界
    • 全角半角

实现效果

EditText密码明文暗文+以星号*显示_第1张图片

需要注意的细节

  • 默认的EditText样式有一条下划线,去掉他
android:background="@null"

默认的样式↓
EditText密码明文暗文+以星号*显示_第2张图片

  • 要求密码格式6~18位,设置最大长度18位,单行显示
android:singleLine="true"
android:maxLength="18"
  • 输入类型是密码类型
android:inputType="textPassword"

InputType对照表

  • xml文件中的inputType值Java代码里的InputType类型 对照表
    EditText密码明文暗文+以星号*显示_第3张图片
    EditText密码明文暗文+以星号*显示_第4张图片

密码暗文:

mClickEt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);

密码明文:

mClickEt.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

InputType实现密码隐藏可见

  • xml中默认隐藏
android:inputType="textPassword"
  • 给小眼睛ImageView设置点击事件
    在这里插入图片描述
if (v.getId() == R.id.iv_old_psw_visible){
            setShowPassword(mOldPswIv, mOldPwdEdt);
            return;
        }
  • 写一个setShowPassword的方法,传入ImageView和EditText两个参数,通过判断EditText的InputType,来改变ImageView的图片。改变InputType后光标会到最前面,使用setSelection方法把输入的光标移到文字最后。
private void setShowPassword(ImageView mClickIv, EditText mClickEt) {
        int visibleType = InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD;
        if (mClickEt.getInputType() == visibleType) {
            mClickIv.setImageDrawable(getResources().getDrawable(R.drawable.bbg_appportal_ic_password_unvisible));
            mClickEt.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
            mClickEt.setSelection(mClickEt.getText().toString().length());
        } else {
            mClickIv.setImageDrawable(getResources().getDrawable(R.drawable.bbg_appportal_ic_password_visible));
            mClickEt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
            mClickEt.setSelection(mClickEt.getText().toString().length());
        }
        return;
    }

或者用setTransformationMethod的方法,设置一个showPassword的flag来判断。但是我要写三个小眼睛,难道要用三个flag嘛…还没想好怎么办,就用第一种方法了

private Boolean showPassword = true;
		......
if (showPassword) {           
			mClickIv.setImageDrawable(getResources().getDrawable(R.drawable.bbg_appportal_ic_password_unvisible));
            mClickEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
            mClickEt.setSelection(mClickEt.getText().toString().length());
            showPassword = !showPassword;
        } else {
            mClickIv.setImageDrawable(getResources().getDrawable(R.drawable.bbg_appportal_ic_password_visible));
            mClickEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
            mClickEt.setSelection(mClickEt.getText().toString().length());
            showPassword = !showPassword;
        }
        return;

星号显示

还有个问题是现在的隐藏密码是以圆点显示的,而交互上的要求是星号
EditText密码明文暗文+以星号*显示_第5张图片

  • 新建一个类,继承自PasswordTransformationMethod
public class AsteriskPasswordTransformationMethod 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) {
            return '*'; // This is the important part
        }
        public int length() {
            return mSource.length(); // Return default
        }
        public CharSequence subSequence(int start, int end) {
            return mSource.subSequence(start, end); // Return default
        }
    }
}
  • 在代码中对EditText进行设置
mOldPwdEdt.setTransformationMethod(new AsteriskPasswordTransformationMethod());

问题出现: 我在设置小眼睛的时候设置的通过InputType修改明文暗文,所以改变密码隐藏和可见以后,就没有*,又回到了·的格式。

查看边界

真机 -> 开发人员选项 -> 绘图 -> 显示布局边界

全角半角

切换EditText的密码为显示和隐藏的时候, 会有全角半角切换的问题。

原因是EditText是密码格式的时候, 默认是全角MONOSPACE的。
所以需要我们手动修改为SANS_SERIF。

mConfirmPwdEdt.setTypeface(Typeface.SANS_SERIF);

参考文章:
https://blog.csdn.net/u011106915/article/details/61913641
https://blog.csdn.net/qq_34471736/article/details/67637694

你可能感兴趣的:(Android)