MODO ERRATO IN ASCOLTO PER UTILIZZARE IL VARIABILE ALL'INTERNO DEL PARAMETRO !!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
IL MODO CORRETTO:
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: in risposta a @ jeroen-bollen
View.OnClickListener
è la definizione di interfaccia per un richiamo da richiamare quando si fa clic su una vista.
con la definizione del metodo
void onClick(View v);
quando si fa clic sulla vista, l'oggetto della classe View effettua il callback al metodo onClick () inviandolo come parametro stesso, quindi il parametro null view non dovrebbe verificarsi se si tratta di un errore di asserzione , potrebbe accadere ad esempio quando View class object è stata distrutta nel frattempo (per esempio raccolto da GC) o il metodo è stato manomesso a causa di hack
poco su instanceof & null
JLS / 15.20.2. Tipo di confronto Operatore instanceof
In fase di esecuzione, il risultato dell'operatore instanceof è vero se il valore di RelationalExpression non è nullo e il riferimento può essere trasmesso a ReferenceType senza generare ClassCastException.
Altrimenti il risultato è falso .
tre parole dell'autore
SE U CHIEDI PERCHÉ?
MAGGIORMENTE DA EVITARE NullPointerException
Un po 'più di codice ti farà risparmiare tempo nel successivo rilevamento dei bug nel tuo codice e riduce il verificarsi di abnomie.
considerare il seguente esempio:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)