Как переключиться между скрытием и просмотром пароля - PullRequest
145 голосов
/ 10 сентября 2010

Есть ли умный способ позволить пользователю переключаться между скрытием и просмотром пароля в Android EditText?Ряд приложений для ПК позволяет пользователю делать это.

Ответы [ 23 ]

249 голосов
/ 18 августа 2016

Это действительно легко сделать, так как Support Library v24.2.0.

Что вам нужно сделать, это просто:

  1. Добавить библиотеку дизайна в ваши зависимости

    dependencies {
         compile "com.android.support:design:24.2.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: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>
    

Атрибут passwordToggleEnabled сделает всю работу!

  1. В корневой макет не забудьте добавить xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Вы можете настроить переключение пароля с помощью:

app:passwordToggleDrawable - Можно использовать в качестве значка переключения видимости ввода пароля.
app:passwordToggleTint - Значок, используемый для переключения видимости ввода пароля.
app:passwordToggleTintMode - Режим наложения, используемый для применения оттенка фона.

Подробнее в Документация TextInputLayout .

enter image description here

Для AndroidX

  • Заменить android.support.design.widget.TextInputLayout на com.google.android.material.textfield.TextInputLayout

  • Заменить android.support.design.widget.TextInputEditText на com.google.android.material.textfield.TextInputEditText

128 голосов
/ 10 сентября 2010

Вы можете динамически изменять атрибуты TextView. Если вы установите для атрибута XML android:password значение true, представление будет показывать точки, если вы установите значение false, текст будет показан.

С помощью метода setTransformationMethod вы сможете изменить эти атрибуты из кода. (Отказ от ответственности: я не проверял, работает ли метод после отображения представления. Если у вас возникли проблемы с этим, оставьте мне комментарий, чтобы я знал.)

Полный пример кода будет

yourTextView.setTransformationMethod(new PasswordTransformationMethod());

чтобы скрыть пароль. Чтобы показать пароль, вы можете установить один из существующих методов преобразования или реализовать пустой TransformationMethod , который ничего не делает с вводимым текстом.

yourTextView.setTransformationMethod(new DoNothingTransformation());
101 голосов
/ 08 марта 2011

Чтобы показывать точки вместо пароля, установите PasswordTransformationMethod:

yourEditText.setTransformationMethod(new PasswordTransformationMethod());

Конечно, вы можете установить это по умолчанию в элементе edittext в макете xml с помощью

android:password

Чтобы снова показать читаемый пароль, просто передайте null как метод преобразования:

yourEditText.setTransformationMethod(null);
73 голосов
/ 21 ноября 2014

Показать:

editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Скрыть:

editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

После каждого из них курсор сбрасывается, поэтому:

editText.setSelection(editText.length());
29 голосов
/ 13 июня 2017

Вы можете использовать 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">
11 голосов
/ 17 декабря 2014

Используйте флажок и соответственно измените тип ввода.

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);
    }
}
7 голосов
/ 20 апреля 2018
private boolean isPasswordVisible;

private TextInputEditText firstEditText;

...

firstEditText = findViewById(R.id.et_first);

...

    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;
}
7 голосов
/ 13 апреля 2015

Это работа для меня. Это вам определенно поможет

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

            }
        });
5 голосов
/ 07 января 2016

Я могу добавить код 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"
            }
        }
    } );
    ...
5 голосов
/ 20 декабря 2015

Я чувствую, что хочу ответить на этот вопрос, даже если есть несколько хороших ответов,

согласно документации TransformationMethod выполнить нашу миссию

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());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...