2017-08-09 6 views
0

Il y a un bouton de bascule de visibilité du mot de passe dans TextInputLayout pour InputType textPassword.Android. TextInputLayout. Basculer l'écouteur d'événement de visibilité de mot de passe?

Est-il en quelque sorte possible d'attraper des événements à bascule?

Je ne pouvais pas trouver des méthodes publiques pour ce

+1

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'. –

+1

Si vous pouvez trouver un moyen d'accéder à 'mPasswordToggleView', vous pouvez trouver une solution. –

+0

@ 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

Répondre

1

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

+1

Ce 'CheckableImageButton' a un ID, apparemment, si vous préférez aller cette route. Le nom est 'text_input_password_toggle', et vous pouvez obtenir la valeur' int' avec la méthode 'Resources # getIdentifier()'. Juste FYI. –

+0

@MikeM. bon à savoir. Juste penser à quoi s'ils changeaient l'id ?! – Tima

+0

Il est peu probable qu'ils le fassent, mais, d'une manière ou d'une autre, c'est une ressource empaquetée dans votre application, et vous contrôlez la version de la bibliothèque de support. C'est-à-dire, tant que vous avez l'ID correct pour la version de la bibliothèque avec laquelle vous compilez, vous êtes bon. Il ne dépendra pas d'une ressource système pouvant différer entre les périphériques. –