#java #android #button #android_on_click #android_button
Доброго времени суток.
Есть MainActivity реализующая интерфейс View.OnClickListener, соответственно есть
метод OnClick типа такого:
public void onClick(View v) {
if (v.getId()==R.id.btnDel){ //Кнопка Удалить
Button btnDel = (Button) v;
btnDel.setText("Отмена");
btnDel.setOnClickListener(oclBtnDelWhileDel);
Выше по коду я создаю oclBtnDelWhileDel таким:
View.OnClickListener oclBtnDelWhileDel = new View.OnClickListener() {
@Override
public void onClick(View v) {
Button btnDel = (Button) v;
btnDel.setText("Удалить");
btnDel.setOnClickListener(this);
}
} ;
Идея в том что метод OnClick класса назначает кнопке слушателя oclBtnDelWhileDel,
а oclBtnDelWhileDel назначает слушателем обратно метод OnClick.
Проблема в том, что при первом нажатии на кнопку, она меняет название на "Отмена"
и назначается слушатель oclBtnDelWhileDel.
А вот при втором нажатии на кнопку название меняется на "Удалить", а вот слушатель
обратно не меняется.
Через дебаггер выполняется опять код oclBtnDelWhileDel.
Вопрос: не могу понять, почему?.
Ответы
Ответ 1
OnClickListener "прикрепляется" к определенной кнопке, и реализует метод обратного вызова (Callback), проще говоря, когда вы нажимаете на кнопку - происходит некоторое действие. Конкретно в вашей реализации очень много некрасивых мест, начиная с объявления кнопки при нажатии на другую кнопку - заканчивая установлением слушателя кнопки внутри реализации onClick другой кнопки. Вы можете просто менять динамически текст на кнопке, и выполнять тот, или иной функционал, допустим: if(btn.getText().equals("Удалить")){ // происходит операция удаления } else { //операция отмены. } Написано на коленке, и вероятно, ответ выше помог более по теме, но и этим не пренебрегайте. Зарефакторите код, станет легче.Ответ 2
View.OnClickListener oclBtnDelWhileDel = new View.OnClickListener() { @Override public void onClick(View v) { Button btnDel = (Button) v; btnDel.setText("Удалить"); btnDel.setOnClickListener(this); //Вот тут ошибка } } ; В данном случае this указывает не на внешний класс, а на View.OnClickListener, таким образом вы устаналиваете слушателем его же самого
Комментариев нет:
Отправить комментарий