NIEPRAWIDŁOWY SPOSÓB W SŁUCHAWCE DO STOSOWANIA ZMIENNEGO ZAMIAST PARAMETRU !!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
WŁAŚCIWY SPOSÓB:
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!");
}
}
}
});
EDYCJA: W odpowiedzi na @ jeroen-bollen
View.OnClickListener
jest definicją interfejsu dla wywołania zwrotnego, które ma być wywoływane po kliknięciu widoku.
z definicją metody
void onClick(View v);
po kliknięciu widoku obiekt klasy View wywołuje wywołanie metody onClick () wysyłającej jako sam parametr, więc parametr widoku zerowego nie powinien wystąpić, jeśli jest to błąd asercji , może się to zdarzyć na przykład, gdy klasa obiektu widoku została w międzyczasie zniszczona (dla przykład zebrany przez GC) lub metoda została zmieniona z powodu włamania
trochę o instanceof i null
JLS / 15.20.2. Porównanie typów Operator instanceof
W czasie wykonywania wynik operatora instanceof ma wartość true, jeśli wartość RelationalExpression nie jest równa null, a odwołanie można rzutować na ReferenceType bez wywoływania wyjątku ClassCastException.
W przeciwnym razie wynik jest fałszywy .
trzy słowa autora
JEŚLI PYTAJ DLACZEGO?
NAJBARDZIEJ UNIKAJ NullPointerException
Niewiele więcej kodu pozwoli zaoszczędzić Twój czas na późniejszym śledzeniu błędów w twoim kodzie i zmniejszy liczbę nieprawidłowości.
rozważ następujący przykład:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)