#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, таким образом вы устаналиваете слушателем его же самого
Комментариев нет:
Отправить комментарий