如何在隐藏和查看密码之间切换

有一个聪明的方法,让用户之间切换隐藏和查看android的EditText中的密码? 一些基于PC的应用程序让用户这样做。

您可以dynamic更改TextView的属性。 如果您将XML Atrribute android:password为true,则视图将显示点,如果将其设置为false,则显示文本。

用方法setTransformationMethod你应该能够从代码中改变这个属性。 (免责声明:我还没有testing,如果方法仍然工作后,视图显示。如果你遇到问题,留下我留言给我知道。)

完整的示例代码将是

 yourTextView.setTransformationMethod(new PasswordTransformationMethod()); 

隐藏密码。 要显示密码,您可以设置一个现有的转换方法,或者实现一个空的TransformationMethod ,它对input文本不做任何事情。

 yourTextView.setTransformationMethod(new DoNothingTransformation()); 

自支持库v24.2.0以来,实现起来非常简单。

你需要做的只是:

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

     dependencies { compile "com.android.support:design:24.2.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:layout_marginBottom="@dimen/login_spacing_bottom"> <android.support.design.widget.TextInputEditText android:id="@+id/etPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/fragment_login_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文档中的更多细节。

在这里输入图像说明

要显示点而不是密码,请设置PasswordTransformationMethod:

 yourEditText.setTransformationMethod(new PasswordTransformationMethod()); 

当然你可以在xml布局的edittext元素中默认设置

 android:password 

要重新显示可读密码,只需传递null作为转换方法:

 yourEditText.setTransformationMethod(null); 

以显示:

 editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); 

隐藏:

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

这些光标都被重置后,所以:

 editText.setSelection(editText.length()); 

使用checkbox并相应地更改inputtypes。

 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int start,end; Log.i("inside checkbox chnge",""+isChecked); if(!isChecked){ start=passWordEditText.getSelectionStart(); end=passWordEditText.getSelectionEnd(); passWordEditText.setTransformationMethod(new PasswordTransformationMethod());; passWordEditText.setSelection(start,end); }else{ start=passWordEditText.getSelectionStart(); end=passWordEditText.getSelectionEnd(); passWordEditText.setTransformationMethod(null); passWordEditText.setSelection(start,end); } } 

你可以使用app:passwordToggleEnabled =“true”

这里是下面给出的例子

 <android.support.design.widget.TextInputLayout android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" app:passwordToggleEnabled="true" android:textColorHint="@color/colorhint" android:textColor="@color/colortext"> 

我觉得我想回答这个问题,即使有一些很好的答案,

根据文档TransformationMethod做我们的使命

TransformationMethod

TextView使用TransformationMethods来执行诸如用点replace密码的字符,或者保持换行符不在单行文本字段中造成换行。

注意我使用黄油刀,但是如果用户检查显示密码,它也是一样的

 @OnCheckedChanged(R.id.showpass) public void onChecked(boolean checked){ if(checked){ et_password.setTransformationMethod(null); }else { et_password.setTransformationMethod(new PasswordTransformationMethod()); } // cursor reset his position so we need set position to the end of text et_password.setSelection(et_password.getText().length()); } 

我可以添加ShowPassword / HidePassword代码,只需几行,自包含在一个块中:

 protected void onCreate(Bundle savedInstanceState) { ... etPassword = (EditText)findViewById(R.id.password); etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password initially checkBoxShowPwd = (CheckBox)findViewById(R.id.checkBoxShowPwd); checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Hide initially, but prompting "Show Password" checkBoxShowPwd.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton arg0, boolean isChecked) { if (isChecked) { etPassword.setTransformationMethod(null); // Show password when box checked checkBoxShowPwd.setText(getString(R.string.label_hide_password)); // Prompting "Hide Password" } else { etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password when box not checked checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Prompting "Show Password" } } } ); ... 

你可以使用下面的代码显示/隐藏密码:

XML代码:

 <EditText android:id="@+id/etPassword" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="21dp" android:layout_marginTop="14dp" android:ems="10" android:inputType="textPassword" > <requestFocus /> </EditText> <CheckBox android:id="@+id/cbShowPwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/etPassword" android:layout_below="@+id/etPassword" android:text="@string/show_pwd" /> 

JAVA代码:

 EditText mEtPwd; CheckBox mCbShowPwd; mEtPwd = (EditText) findViewById(R.id.etPassword); mCbShowPwd = (CheckBox) findViewById(R.id.cbShowPwd); mCbShowPwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override 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()); } } }); 

这对我有用,这对你肯定有帮助

 showpass.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(!isChecked){ // show password password_login.setTransformationMethod(PasswordTransformationMethod.getInstance()); Log.i("checker", "true"); } else{ Log.i("checker", "false"); // hide password password_login.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } } }); 

你尝试setTransformationMethod? 它是从TextViewinheritance的,并且需要一个TransformationMethod作为参数。

您可以在这里find更多关于TransformationMethods的信息 。

它也有一些很酷的function,如字符replace。

在github上试试https://github.com/maksim88/PasswordEditText项目。; 你甚至不需要使用它来改变你的Java代码。 只是改变

的EditText

标签

com.maksim88.passwordedittext.PasswordEditText

在你的XML文件中。

 private int passwordNotVisible=1; @Override protected void onCreate(Bundle savedInstanceState) { showPassword = (ImageView) findViewById(R.id.show_password); showPassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText paswword = (EditText) findViewById(R.id.Password); if (passwordNotVisible == 1) { paswword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); passwordNotVisible = 0; } else { paswword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); passwordNotVisible = 1; } paswword.setSelection(paswword.length()); } }); } 

我做的是

  1. 创build一个编辑文本视图和一个普通文本视图
  2. 通过使用约束布局使它们相互重叠(就像Facebook应用login屏幕一样)
  3. 将onClickListener附加到普通文本视图,以便相应地更改编辑文本视图的inputtypes(可见/不可见)

你可以看看这个video更详细的步骤和解释https://youtu.be/md3eVaRzdIM

希望能帮助到你 :)

这里是我的解决scheme,而不使用TextInputEditText和Transformation方法。

XML

 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView style="@style/FormLabel" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/username" /> <EditText android:id="@+id/loginUsername" style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableLeft="@drawable/ic_person_outline_black_24dp" android:drawableStart="@drawable/ic_person_outline_black_24dp" android:inputType="textEmailAddress" android:textColor="@color/black" /> <TextView style="@style/FormLabel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="@string/password" /> <EditText android:id="@+id/loginPassword" style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableEnd="@drawable/ic_visibility_off_black_24dp" android:drawableLeft="@drawable/ic_lock_outline_black_24dp" android:drawableRight="@drawable/ic_visibility_off_black_24dp" android:drawableStart="@drawable/ic_lock_outline_black_24dp" android:inputType="textPassword" android:textColor="@color/black" /> </LinearLayout> 

Java代码

 boolean VISIBLE_PASSWORD = false; //declare as global variable befor onCreate() loginPassword = (EditText)findViewById(R.id.loginPassword); loginPassword.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { final int DRAWABLE_LEFT = 0; final int DRAWABLE_TOP = 1; final int DRAWABLE_RIGHT = 2; final int DRAWABLE_BOTTOM = 3; if (event.getAction() == MotionEvent.ACTION_UP) { if (event.getRawX() >= (loginPassword.getRight() - loginPassword.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) { // your action here //Helper.toast(LoginActivity.this, "Toggle visibility"); if (VISIBLE_PASSWORD) { VISIBLE_PASSWORD = false; loginPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_off_black_24dp, 0); } else { VISIBLE_PASSWORD = true; loginPassword.setInputType(InputType.TYPE_CLASS_TEXT); loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_black_24dp, 0); } return false; } } return false; } }); 

编译'com.android.support:appcompat-v7:24.2.0'

编译'com.android.support:design:24.2.0'

在布局

  android:inputType="textPassword" 

它的工作

 if (inputPassword.getTransformationMethod() == PasswordTransformationMethod.getInstance()) { //password is visible inputPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } else if(inputPassword.getTransformationMethod() == HideReturnsTransformationMethod.getInstance()) { //password is hidden inputPassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); }