以编程方式将EditText的inputtypes从PASSWORD更改为NORMAL,反之亦然

在我的应用程序中,我有一个EditText它的默认inputtypes被android:inputType="textPassword"设置为android:inputType="textPassword" 。 它的右边有一个CheckBox ,当它被选中时,将EditText的inputtypes改为NORMAL PLAIN TEXT。 代码是 –

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

我的问题是,当该checkbox未选中时,应该再次将inputtypes设置为密码。 我已经使用了 –

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

但是,edittext中的文本仍然可见。 而令人惊讶的是,当我改变orienatation,它会自动设置inputtypes为密码,里面的文字是bulleted(显示为一个密码)。

任何方式来实现这一目标?

只针对有同样问题的人 只需以编程方式向该EditText添加一个额外的属性,即可完成。

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

另外,请确保光标位于EditText文本的末尾。 因为当你改变inputtypes时,光标会被自动设置为起始点。 所以我build议使用下面的代码:

 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 }' 

使用此代码将密码更改为文本,反之亦然

 mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // checkbox status is changed from uncheck to checked. if (!isChecked) { // show password mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance()); } else { // hide password mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } } }); 

完整的示例代码请参考http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty

 password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD); 

上面的方法并不适合我。 下面的答案为2.2 sdk。

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

为EditText设置inputType?

 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()); } } }); 

另一个简单的例子,使用ImageView切换可视性较less的代码,由于单一的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()); } }); 

replace:

 InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 

带有:

 InputType.TYPE_CLASS_TEXT 

会给出相同的结果,但较短的字。

这对我工作:

 mytext.setInputType(InputType.TYPE_CLASS_NUMBER); 

使用此代码将密码更改为文本,反之亦然。 这段代码完全适合我。 尝试这个..

 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); } } }); 

密码可视性切换function已被添加到支持库版本24.2.0,使您可以直接从EditText切换密码,而无需CheckBox

你可以通过首先更新你的支持库版本到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的开发者文档中获得有关新function的更多信息。

这是图像/button显示/隐藏密码的完整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); } }; 

我寻找一个类似的解决scheme的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.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

隐藏字符: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText; et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

设置位置结束: int position = et.Text.Length; et.SetSelection(position, position);

一些dynamic情况holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER); 将不会如此好用

 holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER); holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance()); 

注意:这适合于像使用arrayaapter一样使用dynamic控件的情况

自支持库v24.2.0。 你可以很容易地做到这一点

你需要做的只是:

  1. 将devise库添加到您的依赖项

     dependencies { compile "com.android.support:design:25.1.0" } 
  2. TextInputEditTextTextInputLayout结合使用

     <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属性将使密码切换显示

  1. 在你的根布局中,不要忘记添加xmlns:app="http://schemas.android.com/apk/res-auto"

  2. 您可以使用以下方式自定义密码切换:

app:passwordToggleDrawable – 可绘制用作密码input可见性切换图标。
app:passwordToggleTint – 用于密码input可见性切换的图标。
app:passwordToggleTintMode – 用于应用背景色调的混合模式。

TextInputLayout文档中的更多细节。 在这里输入图像说明

我改变了我的checkbox的inputtypes,所以我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); 

我会从你的布局中删除android:inputType="textPassword" 。 这就是为什么当方向改变时它将切换回密码。 因为每次方向改变视图正在被重新创build。

至于第一个问题,试试这个:

 String text = password.getText(); password.setText(""); password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); password.setText(text); 

在更改inputtypes之前基本上清空文本,然后将其添加回来。

只需对@Rajkiran提供的正确答案进行额外评论,您可能需要添加

 etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 

到正常input状态,以便用户不会被键盘的自动build议恼火

当您要在密码编辑文本中应用密码可见性时,请填写完整的代码。

创build一个句柄[任何可绘制或checkbox]

点击或选中/取消选中写入:

  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()); 

它将光标重置到行尾。

大段引用

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]--; } } }); 

好吧,经过几个小时的努力,终于实现了。 以下是代码

  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)); } } }); 

解释: – 我有一个默认的文本显示button。 在onclick事件后,检查button的文本是否显示。 如果是显示,则更改inputtypes,调整光标位置并将新文本设置为隐藏。

当它隐藏…做反向即隐藏密码,调整光标和设置文本显示。 就是这样。 它像一个魅力工作。