咱们在注册或者登陆App时,不免会须要输入密码。有时候咱们身旁可能有其余人在,为了避免让密码“赤裸裸”地暴露在他人眼皮底下,密码字符串一般会默认显示为暗文(也就是星号或者圆点)。但还有一种状况是咱们在输入密码时有时会小手一抖,会多按几下或者输错了密码,由于都是暗文,咱们就只好把密码全都删掉从新输入了。这个时候咱们就又怀念起能看到密码的日子了。那么有没有方法让密码在明暗文中来回切换呢。答案是确定的,并且还不止一种!下面咱们就来尝试一下吧。java
新建一个PasswordActivity,它的布局很简单:密码输入框就是一个EditText,控制密码是否可见的控件咱们使用ImageView。当密码为明文时,ImageView填充的是睁开眼睛的图片;当密码为暗文时,则是一张闭上眼睛的图片。android
<RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/image" android:hint="请输入密码" android:inputType="textPassword" android:textColorHint="#b7b6b6" /> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@mipmap/hide_pwd_image" /> </RelativeLayout>
在初始化完控件以后,咱们建立一个控制密码是否可见的方法:app
//密碼是否可見 private boolean isPwdVisible = false; /** * 设置密码是否可见 */ private void setPasswordVisible() { //ImageView点击事件 imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //修改密码是否可见的状态 isPwdVisible = !isPwdVisible; //設置密碼是否可見 if (isPwdVisible) { //设置密码为明文,并更改眼睛图标 editText1.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); imageView.setImageResource(R.mipmap.show_pwd_image); } else { //设置密码为暗文,并更改眼睛图标 editText1.setTransformationMethod(PasswordTransformationMethod.getInstance()); imageView.setImageResource(R.mipmap.hide_pwd_image); } //设置光标位置的代码需放在设置明暗文的代码后面 editText1.setSelection(editText1.getText().toString().length()); } });
setTransformationMethod
是TextView的方法(EditText继承于TextView,因此咱们也可使用它),谷歌文档是这样描述它的做用的:ide
Sets the transformation that is applied to the text that this TextView is displaying.函数
大概意思是在TextView显示时,可以对其中的文字进行变换。它须要传入一个TransformationMethod
的对象做为参数,至于在密码可见和不可见时传入什么,你们看上面的代码就知道了。布局
那么咱们怎么判断当前的密码是处于什么状态呢?这个也不难,咱们能够声明一个布尔值变量isPwdVisible
,默认为false,也就是密码不可见。每次改变密码的可见状态时,对其取反就能够了。另外,为了让用户体验更好,每次切换状态后都让光标移至输入框的最末端。this
你们仔细想一想,咱们点击眼睛图片,密码就在可见和不可见两种状态中切换,这是否是看起来很眼熟呢?没错,这不就跟CheckBox同样嘛!每次点击就进行一次取反操做。因此咱们也能够用CheckBox来代替ImageView,而后将背景替换为眼睛图片便可:spa
<RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/checkbox" android:hint="请输入密码" android:inputType="textPassword" android:textColorHint="#b7b6b6" /> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@mipmap/hide_pwd_image" android:button="@null" android:checked="false" /> </RelativeLayout>
记得必定要写上android:button="@null"
把CheckBox本来的方框去掉。.net
换成CheckBox后,咱们就不用声明布尔值变量,而是直接能够调用CheckBox的监听事件:code
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { //CheckBox选中,显示明文 editText2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); checkBox.setBackgroundResource(R.mipmap.show_pwd_image); } else { //CheckBox取消选中,显示暗文 editText2.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); checkBox.setBackgroundResource(R.mipmap.hide_pwd_image); } //光标移至最末端 editText2.setSelection(editText2.getText().toString().length()); } });
这里咱们使用了第二种方法来设置密码是否可见:调用setInputType
方法来改变EditText的输入状态。InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
能够设置密码可见,InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD
则能够隐藏密码。
方法都介绍完了,你们能够看看实现的效果,都是同样的:
本文介绍了使用使用不一样控件和不一样函数来设置EditText的密码是否可见,实际上两两组合起来有四种了。代码很简单,并且我是写在一个大的project中的,因此源码就只放主要文件和图片资源了。
资源下载