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

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

我的问题是,当复选框未选中时,它应该再次设置输入类型为密码。我用过-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

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

有办法实现吗?


当前回答

当您想在密码编辑文本中应用密码可见性时,请完成代码。

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

在点击或在选中/取消选中写这个:

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

它将光标重置到行尾。

其他回答

要将密码更改为可见文本,请使用此选项

profileSignupDialogBinding.signupDialogPassword.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

要将其更改为隐藏文本,请使用此

profileSignupDialogBinding.signupDialogPassword.inputType = InputType.TYPE_TEXT_VARIATION_PASSWORD
profileSignupDialogBinding.signupDialogPassword.transformationMethod = PasswordTransformationMethod.getInstance()

这应该能很好地工作。

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

对于第一个问题,试试这个:

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

基本上是在你改变输入类型之前清空文本,然后再把它加回来。

以编程方式向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

当您想在密码编辑文本中应用密码可见性时,请完成代码。

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

在点击或在选中/取消选中写这个:

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

它将光标重置到行尾。

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

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

当它藏起来的时候……做反向,即隐藏密码,调整光标和设置文本显示。就是这样。它像魔法一样有效。