【问题标题】:Show the password with EditText使用 EditText 显示密码
【发布时间】:2012-03-07 15:19:36
【问题描述】:

我使用 EditText 输入密码。 和一个复选框来显示密码与否。 下面的函数是部分:

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

当它检查时,它会显示密码。 但是当它不检查时,它确实显示了星星。 不勾选cb时如何修改显示star?

【问题讨论】:

  • 你忘了问问题
  • 看看我关于什么是 129..

标签: android android-edittext


【解决方案1】:

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

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

【讨论】:

  • 也不知道。可能是 InputType 整数的组合,但我不知道是哪一个。我通过在更改任何内容之前记录 InputType 得出 129。
  • 1) 当 isChecked = true 时,这应该隐藏密码。看起来相反; 2) 隐藏密码?
  • 您可以使用 (InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_CLASS_TEXT) 而不是 129,因为 int TYPE_TEXT_VARIATION_PASSWORD = 128; int TYPE_CLASS_TEXT = 1;
  • @GeorgeTheodorakis 您需要从评论中删除字符串“VISIBLE_”以使其正确。
【解决方案2】:

这不是答案,

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

我只是想澄清一下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);,您会发现它会起作用。 :)

【讨论】:

  • 谢谢,这让我清醒了。知道 sdk 没有一个常量用于您可以在 xml 本身上实际设置的东西,这真是令人难过。
【解决方案3】:

我认为您使用了错误的功能。我做到了,并且完美地工作:

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。有趣的。它还能做什么?
  • 你放空的地方,另一篇文章说要使用这个:HideReturnsTransformationMethod.getInstance() - 来自:stackoverflow.com/a/19109453/2162226。你的回答对我有用,但你知道一个比另一个更好吗? ..谢谢
  • 谢谢!这是正确的答案。接受的答案在我的测试中不起作用。请看这篇关于为什么 setInputType 不是正确的帖子:stackoverflow.com/questions/2586301/…
  • 完美答案。谢谢
【解决方案4】:

这可能会帮助你交配

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

【讨论】:

  • 发现这个答案真的很有帮助,看起来是实现这一目标的正确方法。但是想知道为什么这最少反对:(
【解决方案5】:

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

您可以通过在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>

【讨论】:

  • 当切换开关突然出现在我的屏幕上时,我自己发现了这一点。有什么办法可以关闭它?
  • 没关系,我刚刚在 Medium 上看到了您解释选项的文章
  • 链接到文档?
【解决方案6】:

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

    您可以尝试使用TYPE_TEXT_VARIATION_NORMAL而不是可见密码

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

    【讨论】:

    • 是的,结果是一样的。
    【解决方案8】:

    在你的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()) 的原因

    【讨论】:

      【解决方案9】:

      这会起作用 -

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

      【讨论】:

        【解决方案10】:

        如果您使用 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);
                };
        

        【讨论】:

          【解决方案11】:

          好的:

          显示可读文本:

          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 会发挥作用...

          【讨论】:

          • TYPE_TEXT_VARIATION_PASSWORD 还让键盘知道它应该将用户输入视为密码,因此不应将其存储为自动完成建议。
          【解决方案12】:
          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);
                  }
          
          }
          

          【讨论】:

            猜你喜欢
            • 2017-08-22
            • 2018-09-03
            • 2013-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多