MAUVAISE FAÇON DANS L'ÉCOUTEUR D'UTILISER LA VARIABLE AU LIEU DU PARAMÈTRE !!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
LA BONNE FAÇON:
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/** check given view by assertion or cast as u wish */
if(v instance of Button) {
/** cast */
Button button = (Button) v;
/** we can perform some check up */
if(button.getId() == EXPECTED_ID) {
/** disable view */
button.setEnabled(false)
button.setClickable(false);
}
} else {
/** you can for example find desired view by root view */
Button bt = (Button) v.getRootView().findViewById(R.id.btId);
/*check for button */
if(bt!=null) {
/** disable button view */
...
} else {
/** according to @jeroen-bollen remark
* we made assumption that we expected a view
* of type button here in other any case
*/
throw new IllegalArgumentException("Wrong argument: " +
"View passed to method is not a Button type!");
}
}
}
});
EDIT: En réponse à @ jeroen-bollen
View.OnClickListener
est la définition d'interface pour un rappel à invoquer lorsqu'un utilisateur clique sur une vue.
avec définition de méthode
void onClick(View v);
lorsque la vue est cliquée, l'objet de classe View rappelle la méthode onClick () en l'envoyant comme paramètre lui-même, donc le paramètre de vue null ne devrait pas se produire s'il le fait, c'est une erreur d'assertion cela pourrait se produire par exemple lorsque la classe d'objet View a été détruite entre-temps (pour exemple collecté par GC) ou la méthode a été falsifiée en raison d'un piratage
peu sur instanceof & null
JLS / 15.20.2. Opérateur de comparaison de type instanceof
Au moment de l'exécution, le résultat de l'opérateur instanceof est vrai si la valeur de RelationalExpression n'est pas nulle et que la référence peut être convertie en ReferenceType sans déclencher une ClassCastException.
Sinon, le résultat est faux .
trois mots de l'auteur
SI VOUS DEMANDEZ POURQUOI?
SURTOUT POUR ÉVITER NullPointerException
Un peu plus de code vous fera gagner du temps lors du suivi ultérieur des bogues dans votre code et réduira l'occurrence d'anomalies.
considérez l'exemple suivant:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)