显示EditText中的密码

30

我使用EditText来输入密码,使用CheckBox来显示密码。 以下是相关代码:

public void ShowPassword() {
    if (cb.isChecked()) {
        password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
    } else {
        password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
    }
}

当复选框被选中时,它会显示密码。 但当未选中时,它会显示星号。 如何修改它以在复选框未选中时显示星号?


How to modify it to show star while the cb is not checked?

你忘记了询问问题。 - Adil Soomro
看看我的关于129是什么的答案。 - user370305
12个回答

68

我不知道具体细节,但这段代码应该可以工作:

checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(!isChecked) {
                    password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                } else {
                    password.setInputType(129);
                }
            }
        });

当设置android:inputType="textPassword"时,输入类型被设置为129

编辑:

如@user370305的答案中所提到的,当你执行按位或操作时,129是其结果值。

password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

没有头绪。可能是InputType整数的组合,但我不知道是哪一个。在更改任何内容之前,我通过记录InputType得出了129。 - josephus
1
  1. 当isChecked = true时,应该隐藏回密码。看起来相反。
  2. 隐藏密码吗?
- Jaroslav
1
你可以使用(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_CLASS_TEXT)代替129, 因为: int TYPE_TEXT_VARIATION_PASSWORD = 128; int TYPE_CLASS_TEXT = 1; - George Theodorakis
@GeorgeTheodorakis 你需要从你的评论中删除字符串"VISIBLE_"以使其正确。 - ciaranodc

49

这不是一个答案,

答案已经被给出并被接受了。

我只是想澄清一下关于129的问题。

password.setInputType(129);

实际上,

password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

'|'不是管道符,而是按位或操作符。它接受两个二进制数字,并且如果其中一个相同位置上的位都为1,则该位的结果也为1。

这与输入类型有何关系:每个InputTypes实际上只是int类型。 TYPE_CLASS_TEXT为1,而TYPE_TEXT_VARIATION_PASSWORD为128(或10000000)

对它们执行按位或操作

00000001

10000000

------------

10000001 which is 129.

尝试输入 input.setInputType(129);,你会发现它可以正常工作。 :)


谢谢,这让我清醒了。只是很遗憾SDK没有一个单独的常量可以用于在XML本身上设置的东西。 - josephus

16

我认为你正在使用错误的函数。我是这样做的,而且完美地运行:

passwordEditView = (EditText) rootView.findViewById(R.id.password);
final CheckBox showPasswordCheckBox = (CheckBox) rootView.findViewById(R.id.checkbox);
showPasswordCheckBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (showPasswordCheckBox.isChecked()){
            passwordEditView.setTransformationMethod(null);
        }else{
            passwordEditView.setTransformationMethod(new PasswordTransformationMethod());
       }
    }
});

以前没有遇到过PasswordTransformationMethod。有趣。它还能做什么? - josephus
在你放置null的地方,另一篇帖子建议使用这个:HideReturnsTransformationMethod.getInstance() - 来自:https://dev59.com/4mkw5IYBdhLWcg3wbqGZ#19109453。你的答案对我有用,但你知道哪一个更好吗?..谢谢 - Gene Bo
谢谢!这是正确的答案。被接受的答案在我的测试中不起作用。请参阅此帖子,了解为什么setInputType不是正确的方法:https://dev59.com/_3E85IYBdhLWcg3w2HNa - Hong
完美的答案。谢谢。 - Jitesh Prajapati

10

这可能对你有所帮助伙计

checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // checkbox status is changed from uncheck to checked.
        if (!isChecked) {
            // show password
            editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
        } else {
            // hide password
            editText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
    }
});

发现这个答案非常有帮助,看起来是实现这个的正确方式。但是不知道为什么它没有被踩得很多。 - Akbarsha

3

密码可见性切换功能已添加到支持库版本24.2.0中,使您可以直接从密码字段切换密码,而无需复选框。

您可以通过在TextInputEditText上设置输入类型为密码来基本实现此功能。以下是如何操作:

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>

当突然在我的屏幕上出现切换按钮时,我自己发现了这个问题。有没有办法关闭它? - Tash Pemhiwa
1
没关系,我刚在Medium上看到了你的文章,在那里你解释了选项。 - Tash Pemhiwa
文档链接在哪里? - Saad Farooq
这里是:https://medium.com/@moyinoluwa/password-visibility-toggle-android-support-library-revision-24-2-0-98b422087e5a#.z7cjlzmni - moyheen

3

使用 app:passwordToggleEnabled = true;,该属性从Android支持库版本24.2.0开始提供。

  <android.support.design.widget.TextInputLayout
    android:id="@+id/input_layout_password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"
    app:passwordToggleEnabled="true"
    tools:visibility="visible"
    android:layout_marginBottom="@dimen/space_medium">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:imeOptions="actionDone"
        android:imeActionLabel="@string/btn_sign_in"
        android:hint="@string/hint_password" />

</android.support.design.widget.TextInputLayout>

2

不要使用可见密码,可以尝试使用TYPE_TEXT_VARIATION_NORMAL。

public void ShowPassword() {
password.setInputType((cb.isChecked()) ? 
InputType.TYPE_TEXT_VARIATION_NORMAL : InputType.TYPE_TEXT_VARIATION_PASSWORD;
}

是的,结果相同。 - brian

1

在您的OnCheckedChangedListener中调用此方法。

 public static void toggleShowPassword(boolean show, EditText editText) {
    if (show)
        editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
    else
        editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
    editText.setSelection(editText.length());
}

EditText光标在更改InputType后会重置其位置,因此我们添加了最后一行editText.setSelection(editText.length())


1
这将起作用 -
public void ShowPassword() {
    if (cb.isChecked()) {
        password.setInputType(InputType.TYPE_CLASS_TEXT);
    } else {
        password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
    }
}

0

如果您正在使用Xamarin(现在称为Visual Studio Mac),可以通过以下方式实现(我使用了Switch)

 /// <summary>
 /// Toggles the password.
 /// </summary>
 /// <param name="field">Field.</param>
 /// <param name="isChecked">If set to <c>true</c> is checked.</param>
 private void TogglePassword(TextView field, bool isChecked)
 {
      /// masks with password character
      if (isChecked)
      {
           field.TransformationMethod = new PasswordTransformationMethod();
      }
      /// unmasks password
      else
      {
           field.TransformationMethod = null;
      }

在你的 Switch 上点击,做类似这样的事情。
switch.Click += delegate {
            TogglePassword(textView, switch.Checked);
        };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接