如何在隐藏和查看密码之间切换

jac*_*nad 158 passwords android

是否有一种聪明的方法让用户在Android EditText中隐藏和查看密码之间切换?许多基于PC的应用程序允许用户执行此操作.

mmB*_*mBs 271

自支持库v24.2.0以来,它实现起来非常简单.

你需要做的只是:

  1. 将设计库添加到您的dependecies

    dependencies {
         compile "com.android.support:design:24.2.0"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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:layout_marginBottom="@dimen/login_spacing_bottom">
    
        <android.support.design.widget.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/fragment_login_password_hint"
            android:inputType="textPassword"/>
    </android.support.design.widget.TextInputLayout>
    
    Run Code Online (Sandbox Code Playgroud)

passwordToggleEnabled属性将完成工作!

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

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

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

TextInputLayout文档中的更多详细信息.

在此输入图像描述

  • 谢谢。然而,在我的构建中,显示/隐藏图形与您的屏幕截图奇怪地相反 - 当隐藏密码时它显示交叉的眼睛 - 我猜有人决定按钮应该显示当前状态而不是操作(或目标状态)。 (2认同)
  • @JoshSutterfield 同意。因此,如果我们想要操作按钮,我们必须使用 `app:passwordToggleDrawable` (已弃用)或 `app:endIconDrawable` 手动反转它,然后使用自定义可绘制对象,如 `&lt;selector xmlns:android="http://schemas.android.com /apk/res/android"&gt; &lt;item android:drawable="@drawable/ic_eye_close" android:state_checked="true"/&gt; &lt;item android:drawable="@drawable/ic_eye_open"/&gt; &lt;/selector&gt;` 我认为谷歌应该修复这个行为。[很好的讨论](https://ux.stackexchange.com/questions/1318/should-a-toggle-button-show-its-current-state-or-the-state-to-which-it-will-chan ) (2认同)

Jan*_*usz 137

您可以动态更改TextView的属性.如果要将XML Atrribute设置android:password为true,则如果将其设置为false,则视图将显示点,显示文本.

使用setTransformationMethod方法,您应该能够从代码中更改此属性.(免责声明:我没有测试该方法在显示视图后是否仍然有效.如果您遇到问题,请留下评论让我知道.)

完整的示例代码将是

yourTextView.setTransformationMethod(new PasswordTransformationMethod());
Run Code Online (Sandbox Code Playgroud)

隐藏密码 要显示密码,您可以设置一个现有的转换方法,或者实现一个对输入文本不做任何处理的空TransformationMethod.

yourTextView.setTransformationMethod(new DoNothingTransformation());
Run Code Online (Sandbox Code Playgroud)

  • 要显示密码,您不需要创建任何新类.只需调用`setTransformationMethod(null)`. (56认同)
  • @Janusz,使用以下将给出gud解决方案.setTransformationMethod(PasswordTransformationMethod.getInstance()); 和setTransformationMethod(HideReturnsTransformationMethod.getInstance()); (4认同)
  • 正确的。“setTransformationMethod() 是关键。您只需要在监听器中切换:etPassword.setTransformationMethod(null) / etPassword.setTransformationMethod(new PasswordTransformationMethod())。默认情况下,在您的 xml EditView 中设置“android:inputType="textPassword “” (3认同)

Qli*_*max 104

要显示点而不是密码,请设置PasswordTransformationMethod:

yourEditText.setTransformationMethod(new PasswordTransformationMethod());
Run Code Online (Sandbox Code Playgroud)

当然,您可以在xml布局中的edittext元素中默认设置此项

android:password
Run Code Online (Sandbox Code Playgroud)

要重新显示可读密码,只需将null作为转换方法传递:

yourEditText.setTransformationMethod(null);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在设置转换方法并在其后恢复之前保存光标位置,从而使用户满意.使用`editText.getSelectionStart()`和`editText.getSelectionEnd()`来保存游标位置,使用`editText.setSelection(start,end)`来恢复它. (51认同)
  • `android:password`现在已被弃用,你应该使用`android:inputType`. (7认同)
  • @Wilka:android:inputType不允许您在运行时在两种状态之间来回切换。它仅允许您切换一次,并且一旦更改就无法将其改回。不,不建议使用setTransformationMethod。 (2认同)

Mat*_*gan 77

显示:

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

隐藏:

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

在每个光标重置后,所以:

editText.setSelection(editText.length());
Run Code Online (Sandbox Code Playgroud)

  • 这是最直接的答案.谢谢.(很奇怪,这不是公认的) (4认同)

小智 30

您可以使用 app:passwordToggleEnabled="true"

这是下面给出的例子

<android.support.design.widget.TextInputLayout
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:passwordToggleEnabled="true"
        android:textColorHint="@color/colorhint"
        android:textColor="@color/colortext">
Run Code Online (Sandbox Code Playgroud)

  • 这在材质组件中已被弃用。使用 `app:endIconMode="password_toggle"`。 (3认同)

小智 16

我有同样的问题,它很容易实现。

您所要做的就是将您的 EditText 字段包装在 (com.google.android.material.textfield.TextInputLayout) 中,然后添加 ( app:passwordToggleEnabled="true" )。

这将在 EditText 字段中显示眼睛,当您单击它时,密码将出现并在再次单击时消失。

<com.google.android.material.textfield.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:textColorHint="#B9B8B8"
                app:passwordToggleEnabled="true">

                <EditText
                    android:id="@+id/register_password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="24dp"
                    android:layout_marginRight="44dp"
                    android:backgroundTint="#BEBEBE"
                    android:hint="Password"
                    android:inputType="textPassword"
                    android:padding="16dp"
                    android:textSize="18sp" />
            </com.google.android.material.textfield.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)


Pra*_*ena 12

使用复选框并相应地更改输入类型.

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    int start,end;
    Log.i("inside checkbox chnge",""+isChecked);
    if(!isChecked){
        start=passWordEditText.getSelectionStart();
        end=passWordEditText.getSelectionEnd();
        passWordEditText.setTransformationMethod(new PasswordTransformationMethod());;
        passWordEditText.setSelection(start,end);
    }else{
        start=passWordEditText.getSelectionStart();
        end=passWordEditText.getSelectionEnd();
        passWordEditText.setTransformationMethod(null);
        passWordEditText.setSelection(start,end);
    }
}
Run Code Online (Sandbox Code Playgroud)


Vla*_*kyi 8

private boolean isPasswordVisible;

private TextInputEditText firstEditText;
Run Code Online (Sandbox Code Playgroud)

...

firstEditText = findViewById(R.id.et_first);
Run Code Online (Sandbox Code Playgroud)

...

    private void togglePassVisability() {
    if (isPasswordVisible) {
        String pass = firstEditText.getText().toString();
        firstEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
        firstEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        firstEditText.setText(pass);
        firstEditText.setSelection(pass.length());           
    } else {
        String pass = firstEditText.getText().toString();
        firstEditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        firstEditText.setInputType(InputType.TYPE_CLASS_TEXT);
        firstEditText.setText(pass);
        firstEditText.setSelection(pass.length());
    }
    isPasswordVisible= !isPasswordVisible;
}
Run Code Online (Sandbox Code Playgroud)


suj*_*h s 7

这对我有用.这对你肯定有帮助

showpass.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(!isChecked){

                    // show password
                    password_login.setTransformationMethod(PasswordTransformationMethod.getInstance());

                    Log.i("checker", "true");
                }

                else{
                    Log.i("checker", "false");

                     // hide password
    password_login.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }

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


bun*_*785 7

首先这是加载了图像矢量资产可见性的屏幕 在此处输入图片说明

单击它会更改为此图像可见性关闭 在此处输入图片说明

上述密码开关的代码(xml代码)

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/laypass"
    android:layout_width="330dp"
    android:layout_height="50dp"
    android:layout_marginTop="24dp"
    app:layout_constraintEnd_toEndOf="@+id/editText3"
    app:layout_constraintStart_toStartOf="@+id/editText3"
    app:layout_constraintTop_toBottomOf="@+id/editText3">

    <EditText
        android:id="@+id/edit_password"
        style="@style/EditTextTheme"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/round"
        android:drawableLeft="@drawable/ic_password"
        android:drawablePadding="10dp"
        android:ems="10"
        android:hint="Password"
        android:inputType="textPassword"
        android:paddingLeft="10dp"
        android:paddingRight="15dp"
        android:textColor="@color/cyan92a6"
        android:textColorHint="@color/cyan92a6"
        android:textCursorDrawable="@null"
        android:textSize="18sp"
        />

    <ImageView
        android:id="@+id/show_pass_btn"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="8dp"
        android:alpha=".5"
        android:onClick="ShowHidePass"
        android:padding="5dp"
        android:src="@drawable/ic_visibility"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/laypass"
        app:layout_constraintTop_toTopOf="@+id/edit_password" /> 
 </androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

按钮操作的Java代码

public void ShowHidePass(View view) {

    if(view.getId()==R.id.show_pass_btn){
        if(edit_password.getTransformationMethod().equals(PasswordTransformationMethod.getInstance())){
            ((ImageView)(view)).setImageResource(R.drawable.ic_visibility_off);
            //Show Password
            edit_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
        else{
            ((ImageView)(view)).setImageResource(R.drawable.ic_visibility);
            //Hide Password
            edit_password.setTransformationMethod(PasswordTransformationMethod.getInstance());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Min*_*wzy 5

我觉得即使有一些好的答案,我也想回答这个问题,

根据文档TransformationMethod来完成我们的任务

转换方法

TextView使用TransformationMethods进行操作,例如用点替换密码字符,或防止换行符在单行文本字段中引起换行。

注意,我使用黄油刀,但是如果用户检查显示密码,则使用黄油刀。

@OnCheckedChanged(R.id.showpass)
    public void onChecked(boolean checked){
        if(checked){
            et_password.setTransformationMethod(null);
        }else {
            et_password.setTransformationMethod(new PasswordTransformationMethod());

        }
       // cursor reset his position so we need set position to the end of text
        et_password.setSelection(et_password.getText().length());
    }
Run Code Online (Sandbox Code Playgroud)


dav*_*lee 5

我能够仅用几行添加ShowPassword / HidePassword代码,这些代码包含在一个块中:

protected void onCreate(Bundle savedInstanceState) {
    ...
    etPassword = (EditText)findViewById(R.id.password);
    etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password initially

    checkBoxShowPwd = (CheckBox)findViewById(R.id.checkBoxShowPwd);
    checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Hide initially, but prompting "Show Password"
    checkBoxShowPwd.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
            if (isChecked) {
                etPassword.setTransformationMethod(null); // Show password when box checked
                checkBoxShowPwd.setText(getString(R.string.label_hide_password)); // Prompting "Hide Password"
            } else {
                etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password when box not checked
                checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Prompting "Show Password"
            }
        }
    } );
    ...
Run Code Online (Sandbox Code Playgroud)


Hir*_*tel 5

以非常简单的形式:

private fun updatePasswordVisibility(editText: AppCompatEditText) {
        if (editText.transformationMethod is PasswordTransformationMethod) {
            editText.transformationMethod = null
        } else {
            editText.transformationMethod = PasswordTransformationMethod()
        }
        editText.setSelection(editText.length())
    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。