今天在做项目的时候遇到了一个关于密码输入框可见性切换问题,上网搜了搜,这里面门道还不小,做一个记录吧,下次遇到就好解决了。
首先写了一个简单的测试工程:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/pwd_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword"/> <Button android:id="@+id/pwd_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="转换"/> </LinearLayout>
package com.example.helloword; import android.app.Activity; import android.os.Bundle; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText pwdEdit; boolean flag = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pwdEdit = (EditText) findViewById(R.id.pwd_edit); Button pwdSwitch = (Button) findViewById(R.id.pwd_switch); pwdSwitch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(flag){ pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); flag = false; }else{ pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); flag = true; } } }); } }结果发现这种方法不行,显示密码后不能再隐藏。
于是就搜了一下,发现有个方法如下:
package com.example.helloword; import android.app.Activity; import android.os.Bundle; import android.text.method.HideReturnsTransformationMethod; import android.text.method.PasswordTransformationMethod; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText pwdEdit; boolean flag = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pwdEdit = (EditText) findViewById(R.id.pwd_edit); Button pwdSwitch = (Button) findViewById(R.id.pwd_switch); pwdSwitch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!flag) { pwdEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } else { pwdEdit.setTransformationMethod(PasswordTransformationMethod.getInstance()); } flag = !flag; pwdEdit.postInvalidate(); } }); } }发现这样虽然可以了,但是光标每次切换后会回到行首,修改后的代码如下:
package com.example.helloword; import android.app.Activity; import android.os.Bundle; import android.text.Selection; import android.text.Spannable; import android.text.method.HideReturnsTransformationMethod; import android.text.method.PasswordTransformationMethod; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText pwdEdit; boolean flag = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pwdEdit = (EditText) findViewById(R.id.pwd_edit); Button pwdSwitch = (Button) findViewById(R.id.pwd_switch); pwdSwitch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!flag) { pwdEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } else { pwdEdit.setTransformationMethod(PasswordTransformationMethod.getInstance()); } flag = !flag; pwdEdit.postInvalidate(); CharSequence text = pwdEdit.getText(); if (text instanceof Spannable) { Spannable spanText = (Spannable)text; Selection.setSelection(spanText, text.length()); } } }); } }虽然完美解决了,但是对这个HideReturnTransformationMethod和PasswordTransformationMethod很陌生,于是就上网搜了一下,发现这个类相当于是一个工具类,专门用来转换输入字符的显示的。而setTransformationMethod 则可以支持将输入的字符转换,如果需要实现自己的转换,可以通过实现 TransformationMethod 接口来达到你的目的(比如让输入的所有字符都变成 a,或者输入 a 显示 z,输入 z 显示 a 等)。
这里仅仅是个记录,如果有什么更好的方法,希望不要吝啬哦 ^_^