Как переключиться между скрытием и просмотром пароля


176

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

Ответы:


156

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

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

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

yourTextView.setTransformationMethod(new PasswordTransformationMethod());

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

yourTextView.setTransformationMethod(new DoNothingTransformation());

61
Чтобы показать пароль, вам не нужно создавать новые классы. Просто позвони setTransformationMethod(null).
Мэтт Куигли

4
@Janusz, использование следующего даст решение гуд. setTransformationMethod (PasswordTransformationMethod.getInstance ()); и setTransformationMethod (HideReturnsTransformationMethod.getInstance ());
Суджит с

@Janusz, но как получить показать / скрыть клавиши на клавиатуре?
Нарендра Сингх

при вызове setTransformationMethod для EditeText вызывается обратный вызов onTextChanged для EditText ... возможно ли, что это не произошло?
Циро

1
Верный. «SetTransformationMethod () является ключом. Все, что вам нужно, это переключиться в вашем слушателе: etPassword.setTransformationMethod (null) / etPassword.setTransformationMethod (new PasswordTransformationMethod ()). По умолчанию, установите в xml EditView« android: inputType = »textPassword «»
Серхио

303

Это действительно легко сделать, так как 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- Drawable для использования в качестве значка переключения видимости ввода пароля.
app:passwordToggleTint- Значок, используемый для переключения видимости ввода пароля.
app:passwordToggleTintMode- Режим наложения, используемый для применения оттенка фона.

Более подробная информация в документации TextInputLayout .

введите описание изображения здесь

Для AndroidX

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

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


В версии 25.1.0 у меня странное поведение: он показывает, что пароль переключается один раз, но если вы нажмете его, он исчезнет o_O '
MiguelHincapieC

1
Да, есть также некоторые причуды с android:textатрибутом TextInputEditText. Вы всегда можете поднять проблему в Google Issues Tracker для Android
mmBs

1
@ Delta7 Есть несколько способов и обходных путей. Пожалуйста, задайте вопрос о SO, вставьте сюда ссылку, и я постараюсь вам помочь.
mmBs

1
Спасибо. Тем не менее, в моей сборке графика показа / скрытия странным образом перевернута с вашего скриншота - он показывает перечеркнутый глаз, когда пароль скрыт - я думаю, кто-то решил, что кнопки должны показывать текущее состояние вместо действия (или состояния цели).
Джош Саттерфилд

1
@JoshSutterfield согласен. поэтому, если нам нужна кнопка действия, мы должны отменить ее вручную, используя app:passwordToggleDrawable(устарело), ​​или app:endIconDrawableзатем использовать настраиваемое рисование, как <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_eye_close" android:state_checked="true"/> <item android:drawable="@drawable/ic_eye_open"/> </selector> я думаю, Google должен исправить это поведение. Хорошая дискуссия
Рахмат Ихсан

112

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

yourEditText.setTransformationMethod(new PasswordTransformationMethod());

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

android:password

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

yourEditText.setTransformationMethod(null);

7
android:passwordустарела, и вы должны использовать android:inputTypeвместо этого.
Вилка

54
Вы также можете сделать своих пользователей счастливыми, сохранив положение курсора перед настройкой метода преобразования и восстановив после него. Используйте editText.getSelectionStart()и editText.getSelectionEnd()для сохранения положения курсора и editText.setSelection(start, end)для его восстановления.
Мостафа

2
@Wilka: android: inputType НЕ позволяет переключаться между двумя состояниями во время выполнения. Он позволяет вам переключаться только один раз, и как только вы измените его, вы не сможете изменить его обратно. И нет, setTransformationMethod НЕ устарел.
AndroidDev

@Qlimax, но как получить показать / скрыть клавиши на клавиатуре?
Нарендра Сингх

@DroidWormNarendra вы обычно прикрепляете прослушиватель событий к «глазному образу» между вашим паролем или внутри вашего пароля, как описано здесь: stackoverflow.com/questions/3554377/… . Затем в этом событии слушатель вы можете показать / скрыть пароль. AFAIK не может иметь некоторые клавиши показа / скрытия на клавиатуре
Qlimax

82

Показывать:

editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Прятаться:

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

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

editText.setSelection(editText.length());

Проверено на Android 4.3 и 5.0, отлично работает! Документы создают впечатление, что это должно работать вплоть до API 3.
Джеймс

@MattLogan, но как получить, показать / скрыть клавиши на клавиатуре?
Нарендра Сингх

5
Это самый прямой ответ здесь. Спасибо. (странно, что это не принято)
Тина

Это не работает при изменении во время выполнения. Это также не восстановит последнюю позицию курсора пользователя / выбор, если не в конце строки.
Том

31

Ты можешь использовать 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">

Сегодня должно быть предпочтительнее использовать ответ
Руслан Берозов

Это увеличивает высоту обзора в моем случае. Есть ли способ убрать отступы из тумблера?
Садда Хуссейн

Это не рекомендуется в материальных компонентах. Использование app:endIconMode="password_toggle".
Николас

13

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

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

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

Не нужно заново устанавливать текст, только вызов firstEditText.invalidate ();
Gunavant Patel

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

            }
        });

5

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

согласно документации 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());
    }

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

5

У меня была такая же проблема, и ее очень легко реализовать.

Все, что вам нужно сделать, это обернуть поле 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>

4
private int passwordNotVisible=1; 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
 showPassword = (ImageView) findViewById(R.id.show_password);
    showPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText paswword = (EditText) findViewById(R.id.Password);
            if (passwordNotVisible == 1) {
                paswword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                passwordNotVisible = 0;
            } else {

                paswword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                passwordNotVisible = 1;
            }


            paswword.setSelection(paswword.length());

        }
    });
}

4

В очень простой форме:

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

Надеюсь, поможет.


3

Вы можете показать / скрыть пароль, используя следующий код:

XML-код:

<EditText
        android:id="@+id/etPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="21dp"
        android:layout_marginTop="14dp"
        android:ems="10"
        android:inputType="textPassword" >
        <requestFocus />
    </EditText>
    <CheckBox
        android:id="@+id/cbShowPwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/etPassword"
        android:layout_below="@+id/etPassword"
        android:text="@string/show_pwd" />

КОД JAVA:

EditText mEtPwd;
CheckBox mCbShowPwd;


mEtPwd = (EditText) findViewById(R.id.etPassword);
mCbShowPwd = (CheckBox) findViewById(R.id.cbShowPwd);

mCbShowPwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // checkbox status is changed from uncheck to checked.
        if (!isChecked) {
            // show password
            mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
        } else {
            // hide password
            mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
    }
});

3

Попробуй это:

Сначала определите флаг как глобальный:

private boolean isShowPassword = false;

И настройте слушателя на обработку нажатия на шоу и скрытия пароля:

imgPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isShowPassword) {
                    etPassword.setTransformationMethod(new PasswordTransformationMethod());
                    imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_hide));
                    isShowPassword = false;
                }else{
                    etPassword.setTransformationMethod(null);
                    imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_show));
                    isShowPassword = true;
                }
            }
        });

2

Попробуйте https://github.com/maksim88/PasswordEditText проект на github. Вам даже не нужно менять свой Java-код, используя его. Просто поменяй

Редактировать текст

тег к

com.maksim88.passwordedittext.PasswordEditText

в вашем XML-файле.


Есть ли у вас какие-либо идеи, как использовать setError с этим компонентом, как только ошибка помечена, значок показать / скрыть становится невидимым
guisantogui

2

показать и скрыть пароль Edit_Text с флажком

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:inputType="textPassword"
        android:id="@+id/edtPass"
        android:textSize="20dp"
        android:hint="password"
        android:padding="20dp"
        android:background="#efeaea"
        android:layout_width="match_parent"
        android:layout_margin="20dp"
        android:layout_height="wrap_content" />

    <CheckBox
        android:background="#ff4"
        android:layout_centerInParent="true"
        android:textSize="25dp"
        android:text="show password"
        android:layout_below="@id/edtPass"
        android:id="@+id/showPassword"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:gravity="top|right"
        android:layout_height="wrap_content" />

</RelativeLayout>

код Java

package com.example.root.sql2;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatCheckBox;
import android.support.v7.widget.Toolbar;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;

public class password extends AppCompatActivity {


    EditText password;
    CheckBox show_hide_password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hide);
        findViewById();
        show_hide_pass();



    }//end onCreate



    public void show_hide_pass(){
        show_hide_password.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (!b){
                    // hide password
                    password.setTransformationMethod(PasswordTransformationMethod.getInstance());

                }else{
                    // show password
                    password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });
    } // end show_hide_pass




    public void findViewById(){ //  find ids ui and
        password = (EditText) findViewById(R.id.edtPass);
        show_hide_password = (CheckBox) findViewById(R.id.showPassword);
    }//end findViewById



}// end class

2

Вы пробовали с setTransformationMethod? Он унаследован от TextView и требует TransformationMethod в качестве параметра.

Вы можете найти больше о TransformationMethods здесь .

Он также имеет несколько интересных функций, таких как замена персонажа.


2
Ссылка в ответе не работает - «Код статуса: 404 Not Found» .
Панг

developer.android.com/reference/android/text/method/… может быть лучшим источником информации о методах преобразования Android.
Мистер Дрю

1

То, что я сделал, было

  1. Создайте текстовое представление редактирования и нормальное текстовое представление
  2. Сделайте так, чтобы они перекрывали друг друга, используя макет ограничений (как экран входа в приложение Facebook)
  3. Присоедините onClickListener к обычному текстовому представлению, чтобы он соответствующим образом изменил тип ввода текстового представления редактирования (видимый / невидимый)

Вы можете проверить это видео для более подробных шагов и объяснений https://youtu.be/md3eVaRzdIM

Надеюсь, поможет :)


1

Вот мое решение без использования TextInputEditText и метода Transformation.

XML

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            style="@style/FormLabel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/username" />

        <EditText
            android:id="@+id/loginUsername"
            style="@style/EditTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_person_outline_black_24dp"
            android:drawableStart="@drawable/ic_person_outline_black_24dp"
            android:inputType="textEmailAddress"
            android:textColor="@color/black" />

        <TextView
            style="@style/FormLabel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/password" />

        <EditText
            android:id="@+id/loginPassword"
            style="@style/EditTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableEnd="@drawable/ic_visibility_off_black_24dp"
            android:drawableLeft="@drawable/ic_lock_outline_black_24dp"
            android:drawableRight="@drawable/ic_visibility_off_black_24dp"
            android:drawableStart="@drawable/ic_lock_outline_black_24dp"
            android:inputType="textPassword"
            android:textColor="@color/black" />
    </LinearLayout>

Java-код

boolean VISIBLE_PASSWORD = false;  //declare as global variable befor onCreate() 
loginPassword = (EditText)findViewById(R.id.loginPassword);
loginPassword.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            final int DRAWABLE_LEFT = 0;
            final int DRAWABLE_TOP = 1;
            final int DRAWABLE_RIGHT = 2;
            final int DRAWABLE_BOTTOM = 3;

            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (event.getRawX() >= (loginPassword.getRight() - loginPassword.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                    // your action here
                    //Helper.toast(LoginActivity.this, "Toggle visibility");
                    if (VISIBLE_PASSWORD) {
                        VISIBLE_PASSWORD = false;
                        loginPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                        loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_off_black_24dp, 0);
                    } else {
                        VISIBLE_PASSWORD = true;
                        loginPassword.setInputType(InputType.TYPE_CLASS_TEXT);
                        loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_black_24dp, 0);
                    }
                    return false;
                }
            }
            return false;
        }
    });

1

Согласно этому источнику , если вы перенесли свой проект на AndroidX, вы можете заменить

compile "com.android.support:design:24.2.0"

с участием

implementation "com.google.android.material:material:1.0.0"

Тогда все, что вам нужно сделать, это поместить приведенный ниже код в файл макета:

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:passwordToggleEnabled="true"
    android:hint="@string/hint_text">

  <com.google.android.material.textfield.TextInputEditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>

</com.google.android.material.textfield.TextInputLayout>

Более подробную информацию о материале TextInputLayoutможно найти здесь .

К этому источнику рекомендуется перейти на AndroidX из библиотеки поддержки Android:

AndroidX - это проект с открытым исходным кодом, который команда Android использует для разработки, тестирования, упаковки, версии и выпуска библиотек в Jetpack.

AndroidX - значительное улучшение оригинальной библиотеки поддержки Android. Как и библиотека поддержки, AndroidX поставляется отдельно от ОС Android и обеспечивает обратную совместимость между версиями Android. AndroidX полностью заменяет библиотеку поддержки, предоставляя функции четности и новые библиотеки. Кроме того, AndroidX включает в себя следующие функции:

Все пакеты в AndroidX живут в согласованном пространстве имен, начиная со строки androidx. Пакеты библиотеки поддержки были сопоставлены с соответствующими пакетами androidx. *. Полное отображение всех старых классов и артефактов сборки на новые см. На странице «Рефакторинг пакетов».

В отличие от библиотеки поддержки, пакеты AndroidX поддерживаются и обновляются отдельно. Пакеты androidx используют строгое семантическое управление версиями, начиная с версии 1.0.0. Вы можете самостоятельно обновлять библиотеки AndroidX в своем проекте.

Все новые разработки библиотеки поддержки будут происходить в библиотеке AndroidX. Это включает в себя обслуживание оригинальных артефактов библиотеки поддержки и введение новых компонентов Jetpack.


1

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

при клике это изменит видимость этого изображения с введите описание изображения здесь

код для переключения пароля выше (код 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>

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

0

В XML делай так

    <LinearLayout
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:orientation="vertical"
          >
          <RelativeLayout
              android:id="@+id/REFReLayTellFriend"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              >
          <EditText
              android:id="@+id/etpass1"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:background="@android:color/transparent"
              android:bottomLeftRadius="10dp"
              android:bottomRightRadius="50dp"
              android:fontFamily="@font/frutiger"
              android:gravity="start"
              android:inputType="textPassword"
              android:hint="@string/regpass_pass1"
              android:padding="20dp"
              android:paddingBottom="10dp"
              android:textColor="#000000"
              android:textColorHint="#d3d3d3"
              android:textSize="14sp"
              android:topLeftRadius="10dp"
              android:topRightRadius="10dp"/>
              <ImageButton
                  android:id="@+id/imgshowhide1"
                  android:layout_width="40dp"
                  android:layout_height="20dp"
                  android:layout_marginTop="20dp"
                  android:layout_marginRight="10dp"
                  android:background="@drawable/showpass"
                  android:layout_alignRight="@+id/etpass1"/>
          </RelativeLayout>    

 boolean show=true;
 //on image click inside password do this
 if(show){
                imgshowhide2.setBackgroundResource(0);
                imgshowhide2.setBackgroundResource(R.drawable.hide);
                etpass2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                etpass2.setSelection(etpass2.getText().length());

                show=false;
            }else{
                imgshowhide2.setBackgroundResource(0);
                imgshowhide2.setBackgroundResource(R.drawable.showpass);
                //etpass1.setInputType(InputType.TYPE_TEXT);
                etpass2.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
                etpass2.setSelection(etpass2.getText().length());
                show=true;
            }

0

Мое расширение Kotlin. пиши один раз используй везде

fun EditText.tooglePassWord() {
this.tag = !((this.tag ?: false) as Boolean)
this.inputType = if (this.tag as Boolean)
    InputType.TYPE_TEXT_VARIATION_PASSWORD
else
    (InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD)

this.setSelection(this.length()) }

Вы можете сохранить этот метод в любом файле и использовать его везде так, как это

ivShowPassword.click { etPassword.tooglePassWord() }

где ivShowPassword нажата imageview (глаз) и etPassword является Editext


0

Хорошее решение Установите кнопку, затем используйте этот код:

public void showPassword(View v)
{

    TextView showHideBtnText = (TextView) findViewById(R.id.textView1);

    if(showHideBtnText.getText().toString().equals("Show Password")){
        password.setTransformationMethod(null);
        showHideBtnText.setText("Hide");
    } else{
        password.setTransformationMethod(new PasswordTransformationMethod());
        showHideBtnText.setText("Show Password");
    }


}

0

Добавьте этот метод:

fun EditText.revertTransformation() {
    transformationMethod = when(transformationMethod) {
        is PasswordTransformationMethod -> SingleLineTransformationMethod.getInstance()
        else -> PasswordTransformationMethod.getInstance()
    }
}

Вызов это переключит между состоянием типа ввода (вы можете изменить однострочное преобразование на ваше любимое). Пример использования:

editText.revertTransformation()

0
1> Make a selector file "show_password_selector.xml".

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pwd_hide"
        android:state_selected="true"/>
    <item android:drawable="@drawable/pwd_show"
        android:state_selected="false" />
</selector>

2>set "show_password_selector" file into imageview.

<ImageView
                        android:id="@+id/iv_pwd"
                        android:layout_width="@dimen/_35sdp"
                        android:layout_height="@dimen/_25sdp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:layout_marginRight="@dimen/_15sdp"
                        android:src="@drawable/show_password_selector" />

3> put below code in java file.
  iv_new_pwd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (iv_new_pwd.isSelected()) {
                iv_new_pwd.setSelected(false);
                Log.d("mytag", "in case 1");
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
            } else {
                Log.d("mytag", "in case 1");
                iv_new_pwd.setSelected(true);
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            }
        }
    });

0
1> Make a selector file "show_password_selector.xml".

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pwd_hide"
        android:state_selected="true"/>
    <item android:drawable="@drawable/pwd_show"
        android:state_selected="false" />
</selector>

2>set "show_password_selector" file into imageview.

<ImageView
                        android:id="@+id/iv_pwd"
                        android:layout_width="@dimen/_35sdp"
                        android:layout_height="@dimen/_25sdp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:layout_marginRight="@dimen/_15sdp"
                        android:src="@drawable/show_password_selector" />

3> put below code in java file.
  iv_new_pwd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (iv_new_pwd.isSelected()) {
                iv_new_pwd.setSelected(false);
                Log.d("mytag", "in case 1");
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
            } else {
                Log.d("mytag", "in case 1");
                iv_new_pwd.setSelected(true);
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            }
        }
    });

-2
if (inputPassword.getTransformationMethod() == PasswordTransformationMethod.getInstance()) {
 //password is visible
                inputPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
            }
else if(inputPassword.getTransformationMethod() == HideReturnsTransformationMethod.getInstance()) {
 //password is hidden
                inputPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
            }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.