【问题标题】:Programmatically change input type of the EditText from PASSWORD to NORMAL & vice versa以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然
【发布时间】:2012-04-11 03:59:15
【问题描述】:

在我的应用程序中,我有一个EditText,其默认输入类型默认设置为android:inputType="textPassword"。它有一个CheckBox它的右图,它在选中时,将该EditText的输入类型更改为正常纯文本。代码是

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

我的问题是,当取消选中 CheckBox 时,它应该再次将输入类型设置为 PASSWORD。我已经使用了-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

但是,edittext 中的文本仍然可见。令人惊讶的是,当我更改方向时,它会自动将输入类型设置为 PASSWORD 并且里面的文本是项目符号(显示为密码)。

有什么方法可以做到这一点?

【问题讨论】:

  • 如何设置编辑文本的电子邮件类型 mailEdt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS);似乎不起作用。
  • 使用mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);。为我工作。

标签: android passwords android-edittext


【解决方案1】:

etPost.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);

【讨论】:

  • 欢迎来到 Stack Overflow。没有任何解释的代码很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请编辑您的问题并解释它如何回答所提出的具体问题。见How to Answer
【解决方案2】:

以编程方式向 EditText 添加一个额外的属性,您就完成了:

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

对于数字密码(pin):

password.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

另外,请确保光标位于EditText 中文本的末尾,因为当您更改输入类型时,光标将自动设置为起始点。所以我建议使用以下代码:

et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());

使用数据绑定时,可以使用如下代码:

<data>
        <import type="android.text.InputType"/>
.
.
.
<EditText
android:inputType='@{someViewModel.isMasked ? 
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'

如果使用 Kotlin:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

【讨论】:

  • 如正确答案所述 - 您可以使用 InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 而不是更改选择
  • 我不明白为什么android选择移动光标,它只会让开发者的生活变得更加困难。
  • +1 这里是best answer
  • 如果用户正在编辑密码字段的中间,这将不断地将光标放在末尾。我建议使用editText.getSelectionStart()editText.getSelectionEnd()setSelection(start, end) 来避免这个问题。
  • 人们甚至不应该往下看。这是最好的答案,建议您按照@JM Lord 的建议进行更改。
【解决方案3】:

使用变换方法:

隐藏:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

可见:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

就是这样。

【讨论】:

    【解决方案4】:

    使用此代码将密码更改为文本,反之亦然

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

    完整的示例代码请参考http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty

    【讨论】:

    • HideReturnsTransformationMethod.getInstance() 显示密码,PasswordTransformationMethod.getInstance() 隐藏密码...实现是正确的,但 cmets 是相反的
    • 这是最好的答案,要完成它,只需将光标移动到最后一个字符:txtpassword.setSelection(txtpassword.getText().length());
    • 由于 EL-conte De-monte TereBentikh 强调的一点,它似乎暂时不起作用。乔希的建议也很有帮助。这是最佳答案。
    • 简单最好的想法
    • 你是教授我的朋友!使用此解决方案,您在更改回密码模式(安全文本)后不会遇到字体问题。
    【解决方案5】:

    在您setInputType 输入密码字段后,您将拥有problem with FONT
    这是我在没有字体问题的情况下显示/隐藏密码的解决方案

    protected void onCreate(Bundle savedInstanceState) {
        ...
        findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isPasswordVisible(edtPassword)) {
                    enableInputHiddenPassword(edtPassword);
                } else {
                    enableInputVisiblePassword(edtPassword);
                }
                edtPassword.setSelection(edtPassword.getText().length());
            }
        });
    }
    
    final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
    final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
    
    private boolean isPasswordVisible(EditText editText) {
        return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
    }
    
    private void enableInputVisiblePassword(EditText editText) {
        Typeface cache = editText.getTypeface();
        editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
        editText.setTypeface(cache);
    }
    
    private void enableInputHiddenPassword(EditText editText) {
        Typeface cache = editText.getTypeface();
        editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
        editText.setTypeface(cache);
    }
    

    注意:我使用InputType.TYPE_TEXT_VARIATION_PASSWORD 而不是InputType.TYPE_CLASS_TEXTHideReturnsTransformationMethod,因为我希望键盘同时显示文本和数字

    DEMO

    【讨论】:

      【解决方案6】:

      基于我在 Kotlin 中编写的 neeraj tEverton Fernandes Rosario 的答案,其中 password 是您布局中 EditText 的 id。

      // Show passwords' symbols.
      private fun showPassword() {
          password.run {
              val cursorPosition = selectionStart
              transformationMethod = HideReturnsTransformationMethod.getInstance()
              setSelection(cursorPosition)
          }
      }
      
      // Show asterisks.
      private fun hidePassword() {
          password.run {
              val cursorPosition = selectionStart
              transformationMethod = PasswordTransformationMethod.getInstance()
              setSelection(cursorPosition)
          }
      }
      

      【讨论】:

        【解决方案7】:

        对于 kotlin 用户:

        password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
        

        【讨论】:

        • 这只会隐藏密码符号?
        【解决方案8】:

        好吧,经过几个小时的尝试终于实现了它。下面是代码..

          buttons.get(2).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
               if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
                   editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
                   editTexts.get(1).setSelection(editTexts.get(1).getText().length());
                   buttons.get(2).setText(getResources().getString(R.string.hide));
                }else{
                   editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
                   //editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
                   editTexts.get(1).setSelection(editTexts.get(1).getText().length());
                   buttons.get(2).setText(getResources().getString(R.string.show));
               }
        
            }
        });
        

        说明:- 我有一个显示默认文本的按钮。 在 onclick 事件之后检查按钮的文本是否显示。 如果显示则更改输入类型,调整光标位置并将新文本设置为隐藏。

        当它隐藏时...做反向,即隐藏密码,调整光标并将文本设置为显示。就是这样。它就像一个魅力。

        【讨论】:

          【解决方案9】:

          我更改了复选框上的输入类型,所以我在OnCheckedChangeListener 上更改了:

          passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
          

          它终于奏效了。

          TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 似乎是一个布尔问题。反转标志,它应该可以解决问题。

          在你的情况下:

          password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
          

          【讨论】:

            【解决方案10】:

            自支持库 v24.2.0 起。你可以很容易地做到这一点

            你需要做的只是:

            1. 将设计库添加到您的依赖项中

              dependencies {
                   compile "com.android.support:design:25.1.0"
              }
              
            2. TextInputEditTextTextInputLayout 结合使用

              <android.support.design.widget.TextInputLayout
                  android:id="@+id/etPasswordLayout"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  app:passwordToggleEnabled="true">
              
                  <android.support.design.widget.TextInputEditText
                      android:id="@+id/etPassword"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:hint="@string/password_hint"
                      android:inputType="textPassword"/>
              </android.support.design.widget.TextInputLayout>
              

            passwordToggleEnabled 属性会使密码切换出现

            1. 不要忘记在你的根布局中添加xmlns:app="http://schemas.android.com/apk/res-auto"

            2. 您可以使用以下方法自定义密码切换:

            app:passwordToggleDrawable - 可绘制以用作密码输入可见性切换图标。
            app:passwordToggleTint - 用于密码输入可见性切换的图标。
            app:passwordToggleTintMode - 用于应用背景色调的混合模式.

            TextInputLayout documentation 中的更多详细信息。

            【讨论】:

              【解决方案11】:
              password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
              

              上面的方法对我来说真的不起作用。以下答案适用于 2.2 sdk。

              password.setTransformationMethod(PasswordTransformationMethod.getInstance());

              Set inputType for an EditText?

              【讨论】:

                【解决方案12】:

                某些动态情况holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER); 将无法正常工作,所以最好同时使用这两种情况

                holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
                holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
                

                注意:这适用于当您使用动态控件时,例如使用 arrayaapter

                【讨论】:

                  【解决方案13】:

                  我对 Visual Studio / Xamarin 的类似解决方案的搜索将我带到了这个线程。以下是对我有用的 Xamarin。请注意,此实现在切换模式时保留TYPE_TEXT_FLAG_NO_SUGGESTIONS 标志。

                  EditText et = FindViewById&lt;EditText&gt;(Resource.Id.ET);

                  显示字符: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

                  隐藏字符: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

                  将位置设置为结束: int position = et.Text.Length; et.SetSelection(position, position);

                  【讨论】:

                  • 如何将此代码if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){ edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD ); }else{ edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ); } 用于 Visual Studio/Xamarin..?
                  • 我的意思是如何在 if() 条件下获取edittext的输入类型..?
                  【解决方案14】:

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

                  您基本上可以通过首先将您的支持库版本更新到 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>
                  

                  您可以在TextInputLayout 的开发者文档中获得有关新功能的更多信息。

                  【讨论】:

                    【解决方案15】:

                    块引用

                    最终 int[] 计数 = {0};

                        showandhide.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                    
                                if(count[0] ==0)
                                {
                                    password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                                    count[0]++;
                                }
                                else {
                    
                                    password.setInputType(InputType.TYPE_CLASS_TEXT |
                                            InputType.TYPE_TEXT_VARIATION_PASSWORD);
                                    showandhide.setText("Hide");
                                    count[0]--;
                                }
                    
                            }
                        });
                    

                    【讨论】:

                      【解决方案16】:
                      Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                      
                                  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                                      // checkbox status is checked.
                                      if (isChecked) {
                                              //password is visible
                       PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());     
                                      } else {
                                              //password gets hided
                                   passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());       
                                      }
                                  }
                              });
                      

                      【讨论】:

                        【解决方案17】:

                        另一个使用 ImageView 以更少代码切换可见性的简单示例,因为单个 InputType 分配我们只需要相等运算符:

                        EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
                        ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
                        inputPasswordShow.setOnClickListener(new View.OnClickListener() {
                             @Override
                             public void onClick(View view) {
                                 if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
                                      inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
                                                                InputType.TYPE_TEXT_VARIATION_PASSWORD);
                                 }else {
                                      inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
                                 }
                                 inputPassword.setSelection(inputPassword.getText().length());
                            }
                        });
                        

                        更换:

                        InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
                        

                        与:

                        InputType.TYPE_CLASS_TEXT
                        

                        将给出相同的结果,但单词更短。

                        【讨论】:

                          【解决方案18】:

                          要在密码编辑文本中应用密码可见性时的完整代码。

                          创建一个句柄 [任何可绘制或复选框]

                          点击或选中/取消选中时写下:

                           if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
                                              InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){
                          
                                          edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                                                  InputType.TYPE_TEXT_VARIATION_PASSWORD );
                                      }else{
                                          edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                                                  InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
                                      }
                          

                          别忘了写下这一行:

                           edittext.setSelection(edittext.getText().length());
                          

                          它将光标重置到行尾。

                          【讨论】:

                          • @PKR 检查实现伙伴,在这种情况下可以使用! :)
                          • @sud007 你知道如何在 Xamarin/visual Studio 中编写 if 条件吗?
                          【解决方案19】:

                          使用此代码将密码更改为文本,反之亦然。 这段代码非常适合我。 试试这个..

                          EditText paswrd=(EditText)view.findViewById(R.id.paswrd);
                          
                          CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
                          showpass.setOnClickListener(new OnClickListener() {
                          
                          @Override
                          public void onClick(View v) {
                              if(((CheckBox)v).isChecked()){
                                  paswrd.setInputType(InputType.TYPE_CLASS_TEXT);
                          
                              }else{
                                  paswrd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
                              }
                          
                          }
                          });
                          

                          【讨论】:

                          • 它与接受的答案有何不同?请在发送垃圾邮件之前仔细阅读问题和答案。
                          【解决方案20】:

                          只是对@Rajkiran 提供的正确答案的附加评论,您可能需要添加

                          etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
                          

                          进入正常输入状态,这样用户就不会被键盘的自动提示所困扰

                          【讨论】:

                            【解决方案21】:

                            这是图像/按钮显示/隐藏密码的完整 onClick 处理程序。

                                new OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        // current ursor position
                                        int cursorPosition = edtPassword.getSelectionStart();
                            
                                        // toggles the control variable
                                        isPassworsVisible = !isPassworsVisible;
                            
                                        // sets the image toggler inside edit text
                                        passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));
                            
                                        // apply input type
                                        edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                            
                                        // returns cursor to position
                                        edtPassword.setSelection(cursorPosition);
                                    }
                                };
                            

                            【讨论】:

                            • 感谢edtPassword.getSelectionStart()
                            【解决方案22】:

                            这对我有用:

                            mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
                            

                            【讨论】:

                            • 请先阅读问题。我想在密码字段和文本字段之间切换。这会给我数字文本字段。
                            【解决方案23】:

                            我会从您的布局中删除 android:inputType="textPassword"。这就是为什么当方向改变时它会切换回密码。因为每次方向更改时,都会重新创建视图。

                            至于第一个问题试试这个:

                            String text = password.getText();
                            password.setText("");
                            password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                            password.setText(text);
                            

                            在更改输入类型之前基本上清空文本,然后将其添加回来。

                            【讨论】:

                            • 不工作。我什至尝试在初始化后立即输入password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);,但是唉!
                            猜你喜欢
                            • 2011-04-11
                            • 2017-10-24
                            • 1970-01-01
                            • 2013-09-21
                            • 2011-01-25
                            • 1970-01-01
                            • 2014-06-19
                            • 2013-08-10
                            • 1970-01-01
                            相关资源
                            最近更新 更多