我正在处理一个带有 Android 的应用程序。我的要求是在用户输入密码时隐藏密码。我知道如何隐藏密码,但用户输入的密码在转换为不可读格式之前是可见的一段时间。任何人都可以在这方面帮助我。
7 回答
输入时隐藏密码字母的 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));
}
}
}
}
不要将默认编辑文本属性设置为密码。相反,您可以使用addTextChangedListener()
which 将在用户输入字符后立即被调用。维护一个活动级别字符串,例如“mPass”。在TextWatcher()
,onTextChanged
方法中,将字符附加到您的 mPass 并用 * 替换输入字符。
但是您必须小心,因为TextWatcher()
即使您将字符替换为 *. 如果处理不当,它将被递归调用,导致应用程序崩溃。
乏味的方式,但它会工作......
一个更简单的原因是将其添加到您的 xml 文件中:
android:inputType="textPassword"
例子:
<android.support.v7.widget.AppCompatEditText
android:id="@+id/password_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:singleLine="true" />
如果您希望在键入时仅显示最后一个字符或第一个字符(如果字符序列长度 == 1)(未屏蔽)。
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// example of usage
((TextView) findViewById(R.id.password)).setTransformationMethod(new AsteriskPasswordTransformationMethod());
}
public class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
@Override
public CharSequence getTransformation(CharSequence source, View view) {
return new PasswordCharSequence(source);
}
private static class PasswordCharSequence implements CharSequence {
private CharSequence mSource;
public PasswordCharSequence(CharSequence source) {
mSource = source; // Store char sequence
}
public char charAt(int index) {
// Only the last character or the first character if length == 1 is visible to the user
return (mSource.length() == index + 1) ? mSource.charAt(index) : '*';
}
public int length() {
return mSource.length(); // Return default
}
@NotNull
public CharSequence subSequence(int start, int end) {
return mSource.subSequence(start, end); // Return default
}
}
}
}
android中有TextView的属性:
android:password 字段的字符是否显示为密码点而不是它们本身。
http://developer.android.com/reference/android/widget/TextView.html#attr_android:password
设置android:password="true"
。它会做你所期望的。
例子:
<EditText
android:id="@+id/editText1"
android:inputType="number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:password="true" />
只需进入一般,安全性,然后滚动直到找到“使密码可见”(键入密码时简要显示密码字符),这将在短时间内阻止字母出现,并减少有人阅读您的密码的机会当你输入它。