Android EditText 切换密码可见状态
方式1:通过设置输入框的type
private static final int InputType_PSW_Hide = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD;// 129
private static final int InputType_PSW_Visible = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;//145
// 如果显示时使用值=128,则此时为文本输入,并非密码输入,如果系统有安全键盘(例如 MIUI系统),则会有键盘切换
//设置密码可见和不可见,使用条件:密码类型为 "textPassword"
public static void setPasswordVisibilityByType(EditText editText, boolean setVisible)
{
if (null != editText)
{
int selectionEnd = editText.getSelectionEnd();
int length = editText.getText().toString().length();
int type = setVisible ? InputType_PSW_Visible : InputType_PSW_Hide;
editText.setInputType(type);
// setInputType方法内有调用 setTransformationMethod
editText.setSelection((Math.min(selectionEnd, length)));
//执行上面的代码后光标会处于输入框的最前方-->重置光标位置
}
}
缺点:密码隐藏,有3种type: “textPassword”、“numberPassword”、“textWebPassword”
但密码显示的type只有一种:“textVisiblePassword”,对应"textPassword",所以不适合在另外两种类型的密码输入时使用
方式2:通过设置输入框的Transformation
public static void setPasswordVisibilityByTransformation(EditText editText, boolean setVisible)
{
if (null != editText)
{
int selectionEnd = editText.getSelectionEnd();
int length = editText.getText().toString().length();
if (setVisible)
{
//可见
editText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else
{
//隐藏
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
editText.setSelection((Math.min(selectionEnd, length)));
//执行上面的代码后光标会处于输入框的最前方-->重置光标位置
}
}
密码显示的样式,和方式1有区别
总结:如果是text类型密码,则使用方法1,如果是另外两种密码类型,则使用方法2
综合:
private static final int InputType_PSW_Hide = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD;// 129
private static final int InputType_PSW_Visible = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;//145
//设置密码可见
public void setPasswordVisibility(EditText editText, boolean setVisible)
{
if (null != editText)
{
int selectionEnd = editText.getSelectionEnd();
int length = editText.getText().toString().length();
int inputType = editText.getInputType();
if (inputType == InputType_PSW_Hide || inputType == InputType_PSW_Visible)
{
editText.setInputType(setVisible ? InputType_PSW_Visible : InputType_PSW_Hide);
} else
{
editText.setTransformationMethod(setVisible ? HideReturnsTransformationMethod.getInstance() : PasswordTransformationMethod.getInstance());
}
editText.setSelection((Math.min(selectionEnd, length)));
//执行上面的代码后光标会处于输入框的最前方-->重置光标位置
}
}