在我的应用程序中,我有一个EditText,其默认输入类型设置为android:inputType="textPassword"默认。它的右侧有一个复选框,选中该复选框时,将该编辑文本的输入类型更改为普通纯文本。它的代码是
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
我的问题是,当复选框未选中时,它应该再次设置输入类型为密码。我用过-
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
但是,编辑文本中的文本仍然可见。令人惊讶的是,当我改变方向时,它会自动将输入类型设置为PASSWORD,其中的文本是项目符号(显示为密码)。
有办法实现吗?
以编程方式向EditText添加一个额外的属性,就完成了:
password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
对于数字密码(pin):
password.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
另外,请确保光标位于EditText中文本的末尾,因为当您更改输入类型时,光标将自动设置为起点。所以我建议使用以下代码:
et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());
当使用数据绑定时,你可以使用以下代码:
<data>
<import type="android.text.InputType"/>
.
.
.
<EditText
android:inputType='@{someViewModel.isMasked ?
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'
如果使用Kotlin:
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
另一个使用ImageView切换可见性的简单例子,代码更少,因为单一的InputType赋值,我们只需要相等操作符:
EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
inputPasswordShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
}else {
inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
}
inputPassword.setSelection(inputPassword.getText().length());
}
});
替换:
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
:
InputType.TYPE_CLASS_TEXT
会给出相同的结果,但更短的单词。
已添加密码可见切换功能以支持库版本24.2.0,使您可以直接从EditText切换密码,而不需要复选框。
您可以首先将支持库版本更新到24.2.0,然后在TextInputEditText上设置密码的inputType。下面是如何做到这一点:
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password"
android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>
您可以在TextInputLayout的开发人员文档中获得有关新特性的更多信息。
在寻找Visual Studio / Xamarin的类似解决方案时,我看到了这个帖子。下面是我使用Xamarin的方法。注意,这个实现在模式切换时保留type_text_flag_no_recommendations标志。
EditText et = FindViewById<EditText>(Resource.Id.ET);
显示字符:
et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | android . text . inputtypes . textflagnosuggestion;
隐藏字符:
et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
将位置设置为结束:
int position = et.Text.Length;
et.SetSelection(位置,位置);
从支持库v24.2.0开始。你可以很容易地做到这一点
你需要做的就是:
Add the design library to your dependecies
dependencies {
compile "com.android.support:design:25.1.0"
}
Use TextInputEditText in conjunction with TextInputLayout
<android.support.design.widget.TextInputLayout
android:id="@+id/etPasswordLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password_hint"
android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>
passwordToggleEnabled属性将显示密码切换
在你的根布局中,不要忘记添加xmlns:app="http://schemas.android.com/apk/res-auto"
您可以使用以下方法自定义密码切换:
app:passwordToggleDrawable -可绘制的使用作为密码输入可见切换图标。
app:passwordToggleTint -用于密码输入可见切换的图标。
app:passwordToggleTintMode -用于应用背景色调的混合模式。
更多细节在TextInputLayout文档。
我改变了我的复选框的输入类型,所以在我的OnCheckedChangeListener我做:
passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
最终成功了。
看起来像是TYPE_TEXT_VARIATION_VISIBLE_PASSWORD的布尔问题。反转标志,应该可以解决问题。
在你的情况下:
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
好吧,经过几个小时的尝试,终于实现了。下面是代码..
buttons.get(2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
editTexts.get(1).setSelection(editTexts.get(1).getText().length());
buttons.get(2).setText(getResources().getString(R.string.hide));
}else{
editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
//editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
editTexts.get(1).setSelection(editTexts.get(1).getText().length());
buttons.get(2).setText(getResources().getString(R.string.show));
}
}
});
解释:-我有一个按钮与默认文本显示。
onclick事件后,它检查按钮的文本是否显示。
如果它是显示,然后改变输入类型,调整光标的位置,并设置新的文本隐藏在其中。
当它藏起来的时候……做反向,即隐藏密码,调整光标和设置文本显示。就是这样。它像魔法一样有效。
当你为密码字段设置tinputtype后,你将会遇到字体问题
这是我的解决方案显示/隐藏密码没有字体问题
protected void onCreate(Bundle savedInstanceState) {
...
findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPasswordVisible(edtPassword)) {
enableInputHiddenPassword(edtPassword);
} else {
enableInputVisiblePassword(edtPassword);
}
edtPassword.setSelection(edtPassword.getText().length());
}
});
}
final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
private boolean isPasswordVisible(EditText editText) {
return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
}
private void enableInputVisiblePassword(EditText editText) {
Typeface cache = editText.getTypeface();
editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
editText.setTypeface(cache);
}
private void enableInputHiddenPassword(EditText editText) {
Typeface cache = editText.getTypeface();
editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
editText.setTypeface(cache);
}
注意:我使用InputType。TYPE_TEXT_VARIATION_PASSWORD代替InputType。TYPE_CLASS_TEXT或HideReturnsTransformationMethod,因为我想让键盘同时显示文本和数字
DEMO