TextInputLayout Пароль Переключить прослушиватель

У меня есть TextInputLayout для пароля. Я добавил passwordToggleEnabled=true для переключения видимости пароля. Мне нужно зафиксировать событие, когда пользователь переключает видимость пароля. Как я могу это сделать.

<android.support.design.widget.TextInputLayout
    android:id="@+id/password_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="start|center"
    app:passwordToggleEnabled="true">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/password_edit_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/enter_new_password"
            android:inputType="textPassword"/>

</android.support.design.widget.TextInputLayout>

person Nitesh V    schedule 28.02.2018    source источник
comment
Вы можете использовать компонент пользовательского интерфейса, опубликованный в этом ответе: stackoverflow.com/a/51264033/789110   -  person GaRRaPeTa    schedule 10.07.2018


Ответы (4)


В источнике TextInputLayout тип представления переключателя - CheckableImageButton. Вам просто нужно найти представление, рекурсивно перебирающее дочерние элементы представления TextInputLayout. А потом setOnTouchListener.

View togglePasswordButton = findTogglePasswordButton(mTextInputLayoutView);
if (togglePasswordButton != null) {
    togglePasswordButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            // implementation
            return false;
        }
    });
}

private View findTogglePasswordButton(ViewGroup viewGroup) {
    int childCount = viewGroup.getChildCount();
    for (int ind = 0; ind < childCount; ind++) {
        View child = viewGroup.getChildAt(ind);
        if (child instanceof ViewGroup) {
            View togglePasswordButton = findTogglePasswordButton((ViewGroup) child);
            if (togglePasswordButton != null) {
                return togglePasswordButton;
            }
        } else if (child instanceof CheckableImageButton) {
            return child;
        }
    }
    return null;
}
person Rainmaker    schedule 28.02.2018
comment
Как я могу проверить, виден ли пароль? В обоих случаях inputtype будет равен 129. - person Nitesh V; 28.02.2018
comment
используйте логическую переменную isVisible, например, в вашем onTouchListener, когда пользователи нажимают кнопку-переключатель, соответственно переключают значение переменной (true или false). Это лучшее, что я могу предложить - person Rainmaker; 28.02.2018
comment
Хорошо, мы можем использовать CheckableImageButton.isChecked, но нам пришлось добавить @SuppressLint(RestrictedApi). В противном случае он показывает ошибку CheckableImageButton.ischecked может быть вызван только из той же группы библиотек. - person Nitesh V; 01.03.2018

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

Поэтому, если вы устанавливаете новый слушатель, вам нужно изменить его самостоятельно:

textInputLayout.setEndIconOnClickListener {
    // Toggle the EditText transformation method from nothing to password or vice versa.
    // Selection is lost in the process so make sure to restore it.
    val editText = textInputLayout.editText
    val oldSelection = editText.selectionEnd
    val hidePassword = editText.transformationMethod !is PasswordTransformationMethod
    passwordEdt.transformationMethod = PasswordTransformationMethod.getInstance().takeIf { hidePassword }
    if (oldSelection >= 0) {
        passwordEdt.setSelection(oldSelection)
    }

    // Do your own stuff here.
}
person Nicolas    schedule 10.04.2020

Пожалуйста, проверьте этот ответ, если вы все еще ищете полное решение о TextInputLayout Password Toggle Listener:

    public class SampleActivity extends AppCompatActivity {

    TextInputLayout password_input_layout;
    TextInputEditText password_edit_text;

    //textInputLayoutEndIconPressed will be tracked, EndIcon is pressed and toggled or not
    private boolean textInputLayoutEndIconPressed;

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

        textInputLayoutEndIconPressed = false;
        password_input_layout = (TextInputLayout) findViewById(R.id.password_input_layout);
        password_edit_text = (TextInputEditText) findViewById(R.id.password_edit_text);

        password_input_layout.setEndIconOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(!textInputLayoutEndIconPressed)
                    textInputLayoutEndIconPressed = true;
                else
                    textInputLayoutEndIconPressed = false;

                if(textInputLayoutEndIconPressed){
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //Changing Drawable file
                            password_input_layout.setEndIconDrawable(getResources().getDrawable(R.drawable.ic_visibility_on));
                            //Changing TextInputEditText password text to open
                            password_edit_text.setTransformationMethod(null);
                        }
                    });
                }else{
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //Changing Drawable file
                            password_input_layout.setEndIconDrawable(getResources().getDrawable(R.drawable.ic_visibility_off));
                            //Changing TextInputEditText password text to hide
                            password_edit_text.setTransformationMethod(new PasswordTransformationMethod());
                        }
                    });
                }
            }
        });

    }
}

Когда вы устанавливаете EndIconOnClickListener, вам необходимо проверить текстовый статус TextInputEditText и файл TextInputLayout EndIcon Drawable. Таким образом, вы можете управлять этим сценарием следующим образом.

person CanDroid    schedule 09.06.2020

См. мой ответ здесь, но вкратце вы можете сделать следующее, так как Material Components v1.1.0 (Kotlin):

textInputLayout.setEndIconOnClickListener {
    // do something here
}
person Paul Spiesberger    schedule 02.03.2020
comment
Нет, этот прослушиватель заменит прослушиватель, который переключает видимость пароля. - person Markus Penguin; 08.06.2020