如何在隐藏和查看密码之间切换
有一个聪明的方法,让用户之间切换隐藏和查看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以来,实现起来非常简单。
你需要做的只是:
-
将devise库添加到您的依赖项
dependencies { compile "com.android.support:design:24.2.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: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
属性将完成这项工作!
-
在你的根布局中,不要忘记添加
xmlns:app="http://schemas.android.com/apk/res-auto"
-
您可以使用以下方式自定义密码切换:
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()); } }); }
我做的是
- 创build一个编辑文本视图和一个普通文本视图
- 通过使用约束布局使它们相互重叠(就像Facebook应用login屏幕一样)
- 将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()); }