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

Raj*_*ran 177 passwords android android-edittext

在我的应用程序中,我有一个EditText默认输入类型android:inputType="textPassword"由deault 设置为.它有一个CheckBox右边的,当被选中时,将EditText的输入类型更改为NORMAL PLAIN TEXT.代码是

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Run Code Online (Sandbox Code Playgroud)

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
Run Code Online (Sandbox Code Playgroud)

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

有没有办法实现这个目标?

Raj*_*ran 317

仅适用于遇到同样问题的人.只需以编程方式为该EditText添加一个额外的属性即可完成.

password.setInputType(InputType.TYPE_CLASS_TEXT |
    InputType.TYPE_TEXT_VARIATION_PASSWORD);
Run Code Online (Sandbox Code Playgroud)

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

et_password.setInputType(InputType.TYPE_CLASS_TEXT | 
    InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());
Run Code Online (Sandbox Code Playgroud)

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

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

如果使用Kotlin,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么在世界上android选择移动光标,它只会让开发人员的生活变得更加困难. (17认同)
  • 如正确答案所述 - 而不是改变选择你可以使用`InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD` (2认同)
  • _ + 1_这里是[最佳答案](http://stackoverflow.com/questions/2586301/set-inputtype-for-an-edittext) (2认同)
  • 如果用户正在编辑密码字段的中间,这将不断将光标放在末尾。我建议使用 `editText.getSelectionStart()` 和 `editText.getSelectionEnd()` 和 `setSelection(start, end)` 来避免这个问题。 (2认同)

nee*_*j t 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());
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

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

  • HideReturnsTransformationMethod.getInstance()显示密码,而PasswordTransformationMethod.getInstance()隐藏密码...实现正确但注释相反 (6认同)
  • 这是最好的答案,要完成它,只需将光标移动到最后一个字符:txtpassword.setSelection(txtpassword.getText().length()); (2认同)

ymu*_*tlu 15

password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
Run Code Online (Sandbox Code Playgroud)

上面的方法对我来说并没有真正起作用.以下答案适用于2.2 sdk.

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

为EditText设置inputType?


小智 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());
    }
});
Run Code Online (Sandbox Code Playgroud)

更换:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
Run Code Online (Sandbox Code Playgroud)

用:

InputType.TYPE_CLASS_TEXT
Run Code Online (Sandbox Code Playgroud)

会得到相同的结果但是字数较短.


小智 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());       
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)


Deb*_*osh 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));
       }

    }
});
Run Code Online (Sandbox Code Playgroud)

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

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


mav*_*r15 5

这对我有用:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
Run Code Online (Sandbox Code Playgroud)


Sur*_*rya 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);
    }

}
});
Run Code Online (Sandbox Code Playgroud)


小智 5

对于kotlin用户:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
Run Code Online (Sandbox Code Playgroud)