Можно ли установить таймер для отображения/скрытия паролей в материальном дизайне?

Итак, я использую библиотеку androidx и реализовал приведенный ниже код в своем xml, чтобы показать/скрыть пароль,

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

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

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

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


person Darpal Dhyani    schedule 19.11.2019    source источник
comment
Почему вы хотите это сделать? Кажется, это может раздражать.   -  person Carson Graham    schedule 22.11.2019


Ответы (2)


Чтобы показать/скрыть пароль, вы можете использовать что-то вроде этого:

TextInputLayout password = findViewById(R.id......);
EditText editText = password.getEditText();
if (editText == null) {
  return;
}
// Store the current cursor position
final int selection = editText.getSelectionEnd();

//This is core condition. It is the key to know if the password is just visible or not.
if (editText != null
    && editText.getTransformationMethod() instanceof PasswordTransformationMethod) {
  editText.setTransformationMethod(null);
} else {
  editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
}

// And restore the cursor position
editText.setSelection(selection);
person Gabriele Mariotti    schedule 19.11.2019
comment
Привет, спасибо за быстрый ответ... на самом деле показать / скрыть пароль для меня не проблема. Просто нужно поставить на него таймер, если пароль виден, и скрыть его, если пользователь не скрыл пароль. - person Darpal Dhyani; 19.11.2019
comment
@DarpalDhyani Чтобы узнать, виден ли пароль, это строка: if (editText != null && editText.getTransformationMethod() instanceof PasswordTransformationMethod) . И это может работать как по клику на endIcon, так и по коду. Поставьте таймер, проверьте условие и затем покажите/скройте пароль. - person Gabriele Mariotti; 19.11.2019
comment
хорошо, понял, спасибо, что разъяснил мне это. Также был бы признателен, если бы у вас был какой-либо ресурс, чтобы взглянуть на getTransformationMethod() и PasswordTransformationMethod ..... никогда не работал с ним раньше. - person Darpal Dhyani; 19.11.2019
comment
TransformationMethods используется TextView для таких вещей, как замена символов. PasswordTransformationMethod — это старый класс, который заменяет символы точками. - person Gabriele Mariotti; 19.11.2019
comment
Спасибо за помощь. Это решило мою проблему. Установка таймера с помощью приведенного выше кода решила проблему. - person Darpal Dhyani; 19.11.2019
comment
Извините, что отвечаю так поздно, но есть еще одна проблема.... в коде. Позиция курсора переключается на конец. Вместо этого есть ли шанс сохранить курсор там, где его оставил пользователь? Я имею в виду, что после написания чего-то, если пользователь настраивает курсор на какую-то букву, он должен оставаться там. - person Darpal Dhyani; 22.11.2019
comment
@DarpalDhyani Это следует сделать с кодом, только что сообщенным в ответе :selection = editText.getSelectionEnd(); и editText.setSelection (выбор); Какую версию TextinputLayout вы используете? - person Gabriele Mariotti; 22.11.2019
comment
Привет, это версия, которую я сейчас использую 'com.google.android.material:material:1.1.0-alpha10' - person Darpal Dhyani; 22.11.2019
comment
@DarpalDhyani Не знаю, связано ли это с реализацией внутри таймера, но в любом случае лучше использовать версию 1.1.0-beta02. - person Gabriele Mariotti; 22.11.2019
comment
Привет, просто обновленная информация о ситуации с курсором. Все еще не работает для меня. Вот мой код, как я реализовал. [Ссылка] (stackoverflow.com/a/58996098/7505562) - person Darpal Dhyani; 22.11.2019

    private void showHidePassword() {
        textInputLayout = activityBinding.textInputLayout;
        textInputEditText = activityBinding.editTextPassword;

        textInputEditText = (TextInputEditText) textInputLayout.getEditText();
        if (textInputEditText == null) {
            return;
        }
        textInputEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                try {
                    if (textInputEditText.getTransformationMethod() == null) {
                        stopHandlerPassword();
                        setTimerPasswordEditText();
                    } else {
                        stopHandlerPassword();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }

    private void setTimerPasswordEditText() {
        passwordEditTextRunnable = new Runnable() {
            public void run() {
                try {
                    if (textInputEditText != null && textInputEditText.getTransformationMethod() == null) {
                        hidePassword();
                    }
                } catch (RuntimeException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        passwordHandler.postDelayed(passwordEditTextRunnable, 8000);
    }

    private void stopHandlerPassword() {
        passwordHandler.removeCallbacks(passwordEditTextRunnable);
    }

    private void hidePassword() {
        if (textInputEditText != null) {
            textInputEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
            try {
                int selection = textInputEditText.getSelectionEnd();
                textInputEditText.setSelection(selection);
              }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

Вот как мне удалось добавить таймер, а также скрыть пароль. Воспользовался помощью Габриэле Мариотти по этой ссылке.

person Darpal Dhyani    schedule 22.11.2019