android:password="true"
这将隐藏字母(****),但不会立即隐藏!当我输入字母时,需要一段时间才能隐藏。
例如,此刻我输入"a";它显示***a,然后变成****。我怎样才能立即改变它?
我相信这种行为是有意为之的,因为Android在智能手机上使用的是小键盘(物理键盘和屏幕键盘),很容易出现打字错误。简短地显示字母是为了让用户可以看到他们是否输入了错误,而不是隐藏它,直到他们得到"密码不正确,您的帐户现在已被锁定"类型错误才知道!
我认为android:password="true"给文本字段分配了一个TransformationMethod,负责将文本转换为点。我不是Android开发人员,但从阅读文档,我可以想象这个TransformationMethod有延迟内置到afterTextChanged回调。你可以试着写你自己的TransformationMethod,看看你是否可以创建你自己的密码屏蔽版本,而不是使用内置的。
请记住文档中关于避免无限循环的警告,因为更新文本可能会重新触发最初通知的事件。
TransformationMethod在输入密码时隐藏字母的实现:
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// example of usage
((TextView) findViewById(R.id.password)).setTransformationMethod(new HiddenPassTransformationMethod());
}
private class HiddenPassTransformationMethod implements TransformationMethod {
private char DOT = 'u2022';
@Override
public CharSequence getTransformation(final CharSequence charSequence, final View view) {
return new PassCharSequence(charSequence);
}
@Override
public void onFocusChanged(final View view, final CharSequence charSequence, final boolean b, final int i,
final Rect rect) {
//nothing to do here
}
private class PassCharSequence implements CharSequence {
private final CharSequence charSequence;
public PassCharSequence(final CharSequence charSequence) {
this.charSequence = charSequence;
}
@Override
public char charAt(final int index) {
return DOT;
}
@Override
public int length() {
return charSequence.length();
}
@Override
public CharSequence subSequence(final int start, final int end) {
return new PassCharSequence(charSequence.subSequence(start, end));
}
}
}
}