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

Posted

技术标签:

【中文标题】以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然【英文标题】:Programmatically change input type of the EditText from PASSWORD to NORMAL & vice versa 【发布时间】:2012-04-11 03:59:15 【问题描述】:

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

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);似乎不起作用。 使用mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);。为我工作。 【参考方案1】:

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

【讨论】:

欢迎来到 Stack Overflow。没有任何解释的代码很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请编辑您的问题并解释它如何回答所提出的具体问题。见How to Answer。【参考方案2】:

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

【讨论】:

如正确答案所述 - 您可以使用 InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD 而不是更改选择 我不明白为什么android选择移动光标,它只会让开发者的生活变得更加困难。 +1 这里是best answer 如果用户正在编辑密码字段的中间,这将不断地将光标放在末尾。我建议使用editText.getSelectionStart()editText.getSelectionEnd()setSelection(start, end) 来避免这个问题。 人们甚至不应该往下看。这是最好的答案,建议您按照@JM Lord 的建议进行更改。【参考方案3】:

使用变换方法:

隐藏:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

可见:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

就是这样。

【讨论】:

【参考方案4】:

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

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

【讨论】:

HideReturnsTransformationMethod.getInstance() 显示密码,PasswordTransformationMethod.getInstance() 隐藏密码...实现是正确的,但 cmets 是相反的 这是最好的答案,要完成它,只需将光标移动到最后一个字符:txtpassword.setSelection(txtpassword.getText().length()); 由于 EL-conte De-monte TereBentikh 强调的一点,它似乎暂时不起作用。乔希的建议也很有帮助。这是最佳答案。 简单最好的想法 你是教授我的朋友!使用此解决方案,您在更改回密码模式(安全文本)后不会遇到字体问题。【参考方案5】:

在您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

【讨论】:

【参考方案6】:

基于我在 Kotlin 中编写的 neeraj t 和 Everton 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)
    

【讨论】:

【参考方案7】:

对于 kotlin 用户:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

【讨论】:

这只会隐藏密码符号?【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

你需要做的只是:

    将设计库添加到您的依赖项中

    dependencies 
         compile "com.android.support:design:25.1.0"
    
    

    TextInputEditTextTextInputLayout 结合使用

    <android.support.design.widget.TextInputLayout
        android:id="@+id/etPasswordLayout"
        android:layout_
        android:layout_
        app:passwordToggleEnabled="true">
    
        <android.support.design.widget.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_
            android:layout_
            android:hint="@string/password_hint"
            android:inputType="textPassword"/>
    </android.support.design.widget.TextInputLayout>
    

passwordToggleEnabled 属性会使密码切换出现

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

    您可以使用以下方法自定义密码切换:

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

TextInputLayout documentation 中的更多详细信息。

【讨论】:

【参考方案11】:
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

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

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

Set inputType for an EditText?

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

【参考方案13】:

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

EditText et = FindViewById&lt;EditText&gt;(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的输入类型..?【参考方案14】:

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

您基本上可以通过首先将您的支持库版本更新到 24.2.0,然后在 TextInputEditText 上设置密码 inputType 来完成这项工作。这样做的方法如下:

<android.support.design.widget.TextInputLayout
        android:layout_
        android:layout_>

        <android.support.design.widget.TextInputEditText
            android:layout_
            android:layout_
            android:hint="@string/password"
            android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>

您可以在TextInputLayout 的开发者文档中获得有关新功能的更多信息。

【讨论】:

【参考方案15】:

块引用

最终 int[] 计数 = 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]--;
            

        
    );

【讨论】:

【参考方案16】:
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());       
                
            
        );

【讨论】:

【参考方案17】:

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

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

【讨论】:

【参考方案18】:

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

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

点击或选中/取消选中时写下:

 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 你知道如何在 Xamarin/visual Studio 中编写 if 条件吗?【参考方案19】:

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

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


);

【讨论】:

它与接受的答案有何不同?请在发送垃圾邮件之前仔细阅读问题和答案。【参考方案20】:

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

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

进入正常输入状态,这样用户就不会被键盘的自动提示所困扰

【讨论】:

【参考方案21】:

这是图像/按钮显示/隐藏密码的完整 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()【参考方案22】:

这对我有用:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

【讨论】:

请先阅读问题。我想在密码字段和文本字段之间切换。这会给我数字文本字段。【参考方案23】:

我会从您的布局中删除 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);,但是唉!

以上是关于以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

在android中以编程方式将EditText视图约束到复选框?

以编程方式将 EditText 的背景资源设置为透明字段

EditText限制输入字符类型的几种方式

以编程方式结合 Textview 和 EditText 创建自定义字段

如何以编程方式在 dp 中设置 EditText 上边距?

如何在 Holo 主题 Api 11-17 Android 中以编程方式将 EditText 背景设置为默认值