以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然
Posted
技术标签:
【中文标题】以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然【英文标题】:Programmatically change input type of the EditText from PASSWORD to NORMAL & vice versa 【发布时间】:2012-04-11 03:59:15 【问题描述】:在我的应用程序中,我有一个EditText
,其默认输入类型默认设置为android:inputType="textPassword"
。它有一个CheckBox
它的右图,它在选中时,将该EditText的输入类型更改为正常纯文本。代码是
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
我的问题是,当取消选中 CheckBox 时,它应该再次将输入类型设置为 PASSWORD。我已经使用了-
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
但是,edittext 中的文本仍然可见。令人惊讶的是,当我更改方向时,它会自动将输入类型设置为 PASSWORD 并且里面的文本是项目符号(显示为密码)。
有什么方法可以做到这一点?
【问题讨论】:
如何设置编辑文本的电子邮件类型 mailEdt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS);似乎不起作用。 使用mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
。为我工作。
【参考方案1】:
etPost.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);
【讨论】:
欢迎来到 Stack Overflow。没有任何解释的代码很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请编辑您的问题并解释它如何回答所提出的具体问题。见How to Answer。【参考方案2】:以编程方式向 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
【讨论】:
如正确答案所述 - 您可以使用InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
而不是更改选择
我不明白为什么android选择移动光标,它只会让开发者的生活变得更加困难。
+1 这里是best answer
如果用户正在编辑密码字段的中间,这将不断地将光标放在末尾。我建议使用editText.getSelectionStart()
和editText.getSelectionEnd()
和setSelection(start, end)
来避免这个问题。
人们甚至不应该往下看。这是最好的答案,建议您按照@JM Lord 的建议进行更改。【参考方案3】:
使用变换方法:
隐藏:
editText.transformationMethod = PasswordTransformationMethod.getInstance()
可见:
editText.transformationMethod = SingleLineTransformationMethod.getInstance()
就是这样。
【讨论】:
【参考方案4】:使用此代码将密码更改为文本,反之亦然
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
【讨论】:
HideReturnsTransformationMethod.getInstance() 显示密码,PasswordTransformationMethod.getInstance() 隐藏密码...实现是正确的,但 cmets 是相反的 这是最好的答案,要完成它,只需将光标移动到最后一个字符:txtpassword.setSelection(txtpassword.getText().length()); 由于 EL-conte De-monte TereBentikh 强调的一点,它似乎暂时不起作用。乔希的建议也很有帮助。这是最佳答案。 简单最好的想法 你是教授我的朋友!使用此解决方案,您在更改回密码模式(安全文本)后不会遇到字体问题。【参考方案5】:在您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
,因为我希望键盘同时显示文本和数字
DEMO
【讨论】:
【参考方案6】:基于我在 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)
【讨论】:
【参考方案7】:对于 kotlin 用户:
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
【讨论】:
这只会隐藏密码符号?【参考方案8】:好吧,经过几个小时的尝试终于实现了它。下面是代码..
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 事件之后检查按钮的文本是否显示。 如果显示则更改输入类型,调整光标位置并将新文本设置为隐藏。
当它隐藏时...做反向,即隐藏密码,调整光标并将文本设置为显示。就是这样。它就像一个魅力。
【讨论】:
【参考方案9】:我更改了复选框上的输入类型,所以我在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);
【讨论】:
【参考方案10】:自支持库 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_
android:layout_
app:passwordToggleEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/etPassword"
android:layout_
android:layout_
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 documentation 中的更多详细信息。
【讨论】:
【参考方案11】:password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
上面的方法对我来说真的不起作用。以下答案适用于 2.2 sdk。
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
Set inputType for an EditText?
【讨论】:
【参考方案12】:某些动态情况holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
将无法正常工作,所以最好同时使用这两种情况
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
注意:这适用于当您使用动态控件时,例如使用 arrayaapter
【讨论】:
【参考方案13】:我对 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);
【讨论】:
如何将此代码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 );
用于 Visual Studio/Xamarin..?
我的意思是如何在 if() 条件下获取edittext的输入类型..?【参考方案14】:
已添加密码可见性切换功能以支持库版本 24.2.0,使您可以直接从 EditText
切换密码,而无需 CheckBox
。
您基本上可以通过首先将您的支持库版本更新到 24.2.0,然后在 TextInputEditText
上设置密码 inputType
来完成这项工作。这样做的方法如下:
<android.support.design.widget.TextInputLayout
android:layout_
android:layout_>
<android.support.design.widget.TextInputEditText
android:layout_
android:layout_
android:hint="@string/password"
android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>
您可以在TextInputLayout 的开发者文档中获得有关新功能的更多信息。
【讨论】:
【参考方案15】:块引用
最终 int[] 计数 = 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]--;
);
【讨论】:
【参考方案16】: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());
);
【讨论】:
【参考方案17】:另一个使用 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
将给出相同的结果,但单词更短。
【讨论】:
【参考方案18】:要在密码编辑文本中应用密码可见性时的完整代码。
创建一个句柄 [任何可绘制或复选框]
点击或选中/取消选中时写下:
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());
它将光标重置到行尾。
【讨论】:
@PKR 检查实现伙伴,在这种情况下可以使用! :) @sud007 你知道如何在 Xamarin/visual Studio 中编写 if 条件吗?【参考方案19】:使用此代码将密码更改为文本,反之亦然。 这段代码非常适合我。 试试这个..
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);
);
【讨论】:
它与接受的答案有何不同?请在发送垃圾邮件之前仔细阅读问题和答案。【参考方案20】:只是对@Rajkiran 提供的正确答案的附加评论,您可能需要添加
etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
进入正常输入状态,这样用户就不会被键盘的自动提示所困扰
【讨论】:
【参考方案21】:这是图像/按钮显示/隐藏密码的完整 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);
;
【讨论】:
感谢edtPassword.getSelectionStart()
。【参考方案22】:
这对我有用:
mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
【讨论】:
请先阅读问题。我想在密码字段和文本字段之间切换。这会给我数字文本字段。【参考方案23】:我会从您的布局中删除 android:inputType="textPassword"
。这就是为什么当方向改变时它会切换回密码。因为每次方向更改时,都会重新创建视图。
至于第一个问题试试这个:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
在更改输入类型之前基本上清空文本,然后将其添加回来。
【讨论】:
不工作。我什至尝试在初始化后立即输入password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
,但是唉!以上是关于以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
在android中以编程方式将EditText视图约束到复选框?