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


190

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

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); 似乎不起作用。
Mahendran

5
使用mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);。为我工作。
拉吉兰(Rajkiran)2012年

Answers:


345

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

2
如正确答案所述-您无需更改选择即可使用InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
-Mente

17
我不明白为什么世界上android选择移动光标,这只会使开发人员的生活更加困难。
拉斐尔·桑切斯


2
如果用户正在编辑密码字段的中间,这将不断将光标置于末尾。我推荐使用editText.getSelectionStart(),并editText.getSelectionEnd()setSelection(start, end)以避免此问题。
JM Lord

1
人们甚至不应该往下看。这是最佳答案,建议您进行@JM Lord的建议更改。
马克

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


6
HideReturnsTransformationMethod.getInstance()显示了密码,而PasswordTransformationMethod.getInstance()隐藏了密码...实现是正确的,但注释相反
Ahmed Adel Ismail 2014年

2
要完成此操作,这是最好的答案,只需使用以下命令将光标移动到最后一个字符:txtpassword.setSelection(txtpassword.getText()。length());
乔什(Josh)2015年

由于EL-conte De-monte TereBentikh强调的观点,片刻似乎不起作用。乔希的建议也有帮助。这是最好的答案。
Ajay 2015年

简单而最好的想法
山姆在2009年

1
你是教授我的朋友!使用此解决方案,在改回密码模式(安全文本)后,您不会遇到字体问题。
Tzegenos

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

上面的方法对我来说并不是真的有效。以下答案适用于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());
    }
});

更换:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

与:

InputType.TYPE_CLASS_TEXT

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


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

隐藏时...反向操作,即隐藏密码,调整光标并将文本设置为show。就是这样。它像魅力一样运作。



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

}
});

与接受的答案有何不同?在发送垃圾邮件之前,请仔细阅读问题和答案。
Rajkiran 2015年

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

谢谢你edtPassword.getSelectionStart()
CoolMind

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


3

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

您需要做的只是:

  1. 将设计库添加到您的依存关系

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. 使用TextInputEditText会同TextInputLayout

    <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文档在此处输入图片说明


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


如何将此代码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的输入类型。
sunil y 17-4-17

2

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

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

注意:这适用于使用动态控件(例如,使用arrayaapter)的情况


2

你以后setInputType输入密码字段,你将有问题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因为我希望键盘同时显示文本和数字

演示


1

我会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);在初始化后立即放置,但是but!
Rajkiran 2012年

1

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

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

单击或选中/取消选中时,请写下以下内容:

 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

@ sud007您是否知道如何在Xamarin / visual Studio中编写if条件?
sunil y 17-4-17

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

1

使用转换方法:

隐藏:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

可见:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

而已。


0

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

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

设置为NORMAL(正常)输入状态,以便用户不会因为键盘的自动提示而烦恼


0

块引用

最终的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]--;
            }

        }
    });

0

基于neeraj tEverton Fernandes Rosario的回答,我在Kotlin中写道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)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.