MANERA INCORRECTA EN EL ESCUCHADOR PARA USAR VARIABLE EN LUGAR DEL PARÁMETRO !!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
MANERA CORRECTA:
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!");
}
}
}
});
EDITAR: en respuesta a @ jeroen-bollen
View.OnClickListener
es la definición de interfaz para que se invoque una devolución de llamada cuando se hace clic en una vista.
con definición de método
void onClick(View v);
cuando se hace clic en la vista, el objeto de la clase Ver hace una devolución de llamada al método onClick () que se envía como parámetro en sí mismo, por lo que el parámetro de vista nula no debería ocurrir si lo hace es un Error de aserción , por ejemplo, cuando la clase de objeto Ver se destruyó mientras tanto (para ejemplo recogido por GC) o el método fue alterado debido a un pirateo
poco sobre instanceof & null
JLS / 15.20.2. Operador de comparación de tipos instanceof
En tiempo de ejecución, el resultado del operador instanceof es verdadero si el valor de RelationalExpression no es nulo y la referencia se puede convertir al ReferenceType sin generar una ClassCastException.
De lo contrario, el resultado es falso .
tres palabras del autor
SI PREGUNTAS POR QUÉ
PARA EVITAR NULLPointerException
Un poco más de código le ahorrará tiempo en el seguimiento posterior de errores en su código y reduce la aparición de anomalías.
considere el siguiente ejemplo:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)