J'ai regardé le code source du TextInputLayout pour trouver le type de vue du bouton à bascule. Son CheckableImageButton. Tout le reste est facile. Vous devez trouver la vue en itérant récursivement sur les enfants de la vue TextInputLayout. Et puis setOnTouchListener comme @MikeM suggéré dans les commentaires.
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;
}
Une implmentation alternative de findTogglePasswordButton
private View findTogglePasswordButton() {
return findViewById(R.id.text_input_password_toggle);
}
@MikeM. merci pour l'id
Pas vraiment. Eh bien, rien de facilement disponible, de toute façon. Ce 'View' a un' OnClickListener' anonyme qui ne fait qu'appeler une méthode toggle de package-private. Je peux penser à quelques façons de faire semblant. Le plus simple est probablement d'obtenir une référence à ce 'View', et de définir un' OnTouchListener', car vous pouvez le configurer pour ne pas interférer avec 'OnClickListener'. –
Si vous pouvez trouver un moyen d'accéder à 'mPasswordToggleView', vous pouvez trouver une solution. –
@ K.Sopheak je pensais, peut-être il ya une solution officielle pour cela :) et oui, c'est la façon dont j'essaie maintenant – Tima