以编程方式将EditText的输入类型从PASSWORD更改为NORMAL,反之亦然

问题描述 投票:179回答:21

在我的应用程序中,我有一个EditText,其默认输入类型通过deault设置为android:inputType="textPassword"。它的右边有一个CheckBox,选中该复选框时,会将那个EditText的输入类型更改为NORMAL PLAIN TEXT。代码是

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

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

完成了
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

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

实现这一目标的任何方法?

android passwords android-edittext
21个回答
319
投票

仅适用于遇到相同问题的人。只需以编程方式向该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

3
投票

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


3
投票

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


3
投票

自支持库v24.2.0起。您可以非常轻松地实现]


2
投票

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


2
投票

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


2
投票

在您将setInputType输入密码字段后,您将获得problem with FONT这是我的显示/隐藏密码而不出现字体问题的解决方案


1
投票

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


1
投票

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


0
投票

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


0
投票

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


55
投票

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

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


0
投票

Blockquote


0
投票

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


15
投票
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

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

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

Set inputType for an EditText?


12
投票

另一个使用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

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


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

6
投票

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

  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事件之后,检查按钮的文本是否显示。如果显示,则更改输入类型,调整光标位置并将新文本设置为隐藏在其中。

[隐藏时...进行相反的操作,即隐藏密码,调整光标并将文本设置为显示。就是这样。它像魅力一样运作。


5
投票

这对我有用:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

5
投票

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

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

}
});

5
投票

对于Kotlin用户:

© www.soinside.com 2019 - 2024. All rights reserved.