使用EditText显示密码

时间:2012-02-16 08:14:46

标签: android android-edittext

我使用EditText输入密码。 还有一个CheckBox来显示密码。 以下功能是部分:

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

选中后,会显示密码。 但是当它没有被检查时,它确实显示了星星。 如何修改它以在未选中cb时显示星标?

12 个答案:

答案 0 :(得分:60)

我不确切知道具体细节,但这段代码应该有效:

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);
                }
            }
        });

129是设置android:inputType="textPassword"

时设置的输入类型

编辑:

在@ user370305的回答中提到,129是你做的按位或操作的值

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

答案 1 :(得分:46)

这不是答案,

已经给出并接受了答案..

我只想澄清一下129

password.setInputType(129);

实际上是

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

<强> '|'不是管道,它是bitwise OR。它需要两个二进制数,如果其中任何一个相等的值是1,

这与输入类型有何关系:每个InputTypes实际上只是整数。 TYPE_CLASS_TEXT is 1TYPE_TEXT_VARIATION_PASSWORD is 128 (or 10000000)

对他们执行bitwise OR

00000001

10000000

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

10000001 which is 129.

尝试输入input.setInputType(129);,您会发现它会起作用。 :)

答案 2 :(得分:15)

我认为你使用的是错误的功能。我这样做并完美地工作:

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());
       }
    }
});

答案 3 :(得分:7)

这可能会帮助你交配

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());
        }
    }
});

答案 4 :(得分:3)

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

您可以通过在TextInputEditText上设置密码的inputType来实现这项工作。以下是如何做到这一点:

<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>

答案 5 :(得分:2)

代替可见密码,您可以尝试使用TYPE_TEXT_VARIATION_NORMAL

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

答案 6 :(得分:2)

使用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>

答案 7 :(得分: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())

答案 8 :(得分: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);
    }
}

答案 9 :(得分: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);
        };

答案 10 :(得分:-1)

好:

显示可重复文本:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)

要为密码“加注星标”:

setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD)

但为什么呢? Type_Text_Variation_Password将其设置为星号,但为什么只添加Type_Claas_Text会恢复visibel密码?
我原以为Type_Text_Variation_VISIBLE_Password会发挥作用......

答案 11 :(得分:-1)

public void onCheckBox(View v2)
{



    CheckBox cb = (CheckBox)this.findViewById(R.id.pass_Check);
    EditText et1=(EditText)this.findViewById(R.id.edt_Pass);
        if(cb.isChecked())
        {
        et1.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
        }
        else 
        {
        et1.setInputType(129);
        }

}