Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Назначение OnClickListener

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

Комментариев нет:

Отправить комментарий