在我的应用程序中,我有一个EditText
,其默认输入类型由deault设置为android:inputType="textPassword"
。它的右边有一个CheckBox
,当选中它时,会将EditText的输入类型更改为NORMAL PLAIN TEXT。代码是
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
我的问题是,当取消选中CheckBox时,它应该再次将输入类型设置为PASSWORD。我用 -
完成了password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
但是,该edittext中的文本仍然可见。令人惊讶的是,当我更改orienatation时,它会自动将输入类型设置为PASSWORD,并且里面的文本是项目符号(显示为密码)。
有任何方法可以达到这个目的吗?
答案 0 :(得分:294)
仅针对遇到同样问题的人。只需以编程方式为该EditText添加一个额外的属性即可。
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_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
答案 1 :(得分:55)
使用此代码将密码更改为文本,反之亦然
mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is changed from uncheck to checked.
if (!isChecked) {
// hide password
mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
} else {
// show password
mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
有关完整示例代码,请参阅http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty
答案 2 :(得分:15)
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
上面的方法对我来说并没有真正起作用。以下答案适用于2.2 sdk。
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
答案 3 :(得分:12)
使用 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
会给出相同的结果,但字数会更短。
答案 4 :(得分:11)
Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is checked.
if (isChecked) {
//password is visible
PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else {
//password gets hided
passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
}
});
答案 5 :(得分:6)
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));
}
}
});
说明: - 我有一个按钮,默认文字为show。 onclick事件后,检查是否显示按钮的文本。 如果显示,则更改输入类型,调整光标位置并将新文本设置为隐藏在其中。
当它隐藏时......做反向即隐藏密码,调整光标并将文本设置为显示。就是这样。它的工作就像一个魅力。
答案 6 :(得分:5)
对于Kotlin用户:
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
答案 7 :(得分:5)
这对我有用:
mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
答案 8 :(得分:4)
使用此代码将密码更改为文本,反之亦然。 这段代码对我来说非常有用。 试试这个..
EditText paswrd=(EditText)view.findViewById(R.id.paswrd);
CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
showpass.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(((CheckBox)v).isChecked()){
paswrd.setInputType(InputType.TYPE_CLASS_TEXT);
}else{
paswrd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
}
}
});
答案 9 :(得分:3)
这是用于显示/隐藏密码的图像/按钮的完整onClick处理程序。
new OnClickListener() {
@Override
public void onClick(View v) {
// current ursor position
int cursorPosition = edtPassword.getSelectionStart();
// toggles the control variable
isPassworsVisible = !isPassworsVisible;
// sets the image toggler inside edit text
passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));
// apply input type
edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
// returns cursor to position
edtPassword.setSelection(cursorPosition);
}
};
答案 10 :(得分:3)
自支持库v24.2.0起。你可以轻松地解决这个问题
您需要做的只是:
将设计库添加到您的家属
dependencies {
compile "com.android.support:design:25.1.0"
}
将TextInputEditText
与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
- 用于应用背景色调的混合模式。
答案 11 :(得分:3)
已添加密码可见性切换功能以支持库版本24.2.0,使您可以直接从EditText
切换密码,而无需CheckBox
。
您可以基本上首先将支持库版本更新为24.2.0,然后在inputType
上设置TextInputEditText
密码。以下是如何做到这一点:
<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的开发者文档中获取有关新功能的更多信息。
答案 12 :(得分:2)
我为Visual Studio / Xamarin搜索类似的解决方案引导我进入这个主题。以下是Xamarin对我有用的内容。请注意,在模式之间切换时,此实现会保留TYPE_TEXT_FLAG_NO_SUGGESTIONS
标志。
EditText et = FindViewById<EditText>(Resource.Id.ET);
显示字符:
et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;
隐藏字符:
et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
设置结束位置:
int position = et.Text.Length;
et.SetSelection(position, position);
答案 13 :(得分:2)
在setInputType
输入密码字段后,您将拥有problem with FONT
这是我的显示/隐藏密码而不出现字体问题的解决方案
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
,因为我希望键盘同时显示文本和数字
答案 14 :(得分:2)
某些动态情况holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
无效,所以更好地使用这两种情况
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
注意:这适用于使用动态控件,例如使用arrayaapter
答案 15 :(得分:1)
我在复选框上更改了输入类型,因此在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);
答案 16 :(得分:1)
使用转换方法:
隐藏:
editText.transformationMethod = PasswordTransformationMethod.getInstance()
可见:
editText.transformationMethod = SingleLineTransformationMethod.getInstance()
就是这样。
答案 17 :(得分:0)
块引用
final int [] count = {0};
showandhide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(count[0] ==0)
{
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
count[0]++;
}
else {
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
showandhide.setText("Hide");
count[0]--;
}
}
});
答案 18 :(得分:0)
我会从您的布局中删除android:inputType="textPassword"
。这就是为什么它在方向改变时切换回密码的原因。因为每次方向更改时,都会重新创建视图。
关于第一个问题,试试这个:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
在更改输入类型之前基本清空文本,然后将其添加回来。
答案 19 :(得分:0)
如果要在密码编辑文本中应用密码可见性,请填写完整的代码。
创建句柄[任何可绘制或复选框]
单击或选中选中/取消选中以下内容:
if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){
edittext.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD );
}else{
edittext.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
}
不要忘记写这一行:
edittext.setSelection(edittext.getText().length());
它将光标重置为行尾。
答案 20 :(得分:0)
对@Rajkiran提供的正确答案的另外评论,您可能想要添加
etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
到NORMAL输入状态,这样用户不会被键盘的自动建议烦恼
答案 21 :(得分:0)
基于我在Kotlin中写的neeraj t和Everton Fernandes Rosario的答案,其中password
是布局中EditText的ID。
// Show passwords' symbols.
private fun showPassword() {
password.run {
val cursorPosition = selectionStart
transformationMethod = HideReturnsTransformationMethod.getInstance()
setSelection(cursorPosition)
}
}
// Show asterisks.
private fun hidePassword() {
password.run {
val cursorPosition = selectionStart
transformationMethod = PasswordTransformationMethod.getInstance()
setSelection(cursorPosition)
}
}
答案 22 :(得分:0)
etPost.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);