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

时间:2012-03-27 15:26:23

标签: android passwords android-edittext

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

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

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

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

有任何方法可以达到这个目的吗?

23 个答案:

答案 0 :(得分:294)

仅针对遇到同样问题的人。只需以编程方式为该EditText添加一个额外的属性即可。

password.setInputType(InputType.TYPE_CLASS_TEXT |
    InputType.TYPE_TEXT_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

答案 1 :(得分: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

答案 2 :(得分:15)

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

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

  

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

Set inputType for an EditText?

答案 3 :(得分: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

会给出相同的结果,但字数会更短。

答案 4 :(得分: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());       
                }
            }
        });

答案 5 :(得分: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));
       }

    }
});

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

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

答案 6 :(得分:5)

对于Kotlin用户:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

答案 7 :(得分:5)

这对我有用:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

答案 8 :(得分:4)

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

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

}
});

答案 9 :(得分:3)

这是用于显示/隐藏密码的图像/按钮的完整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);
        }
    };

答案 10 :(得分:3)

自支持库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>
    
  3. passwordToggleEnabled属性将使密码切换显示

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

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

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

      TextInputLayout documentation中的更多详情。 enter image description here

答案 11 :(得分:3)

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

您可以基本上首先将支持库版本更新为24.2.0,然后在inputType上设置TextInputEditText密码。以下是如何做到这一点:

<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的开发者文档中获取有关新功能的更多信息。

答案 12 :(得分:2)

我为Visual Studio / Xamarin搜索类似的解决方案引导我进入这个主题。以下是Xamarin对我有用的内容。请注意,在模式之间切换时,此实现会保留TYPE_TEXT_FLAG_NO_SUGGESTIONS标志。

EditText et = FindViewById<EditText>(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);

答案 13 :(得分:2)

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

答案 14 :(得分:2)

某些动态情况holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);无效,所以更好地使用这两种情况

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

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

答案 15 :(得分:1)

我在复选框上更改了输入类型,因此在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);

答案 16 :(得分:1)

使用转换方法:

隐藏:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

可见:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

就是这样。

答案 17 :(得分:0)

  

块引用

final int [] count = {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]--;
            }

        }
    });

答案 18 :(得分:0)

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

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

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

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

答案 19 :(得分:0)

如果要在密码编辑文本中应用密码可见性,请填写完整的代码。

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

单击或选中选中/取消选中以下内容:

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

它将光标重置为行尾。

答案 20 :(得分:0)

对@Rajkiran提供的正确答案的另外评论,您可能想要添加

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

到NORMAL输入状态,这样用户不会被键盘的自动建议烦恼

答案 21 :(得分:0)

基于我在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)
    }
}

答案 22 :(得分:0)

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