Я не совсем понимаю onClickListeners

Итак, когда мы устанавливаем onClickListener, скажем, на кнопку, это выглядит примерно так.

private Button myButton = (Button) findViewById(R.id.my_button);

myButton.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View view){
        //do this
    }

});

Итак, мы создаем безымянный анонимный класс, когда заявляем новый View.OnClickListener ... и реализуем интерфейс OnClickListener / и переопределяем его метод onClick. Я не понимаю, если у нас нет ссылки на этот анонимный класс, потому что он безымянный, как вызывается метод onClick ()? Я когда-либо реализовал анонимный класс только для переопределения определенных методов в указанном классе, например:

public class Foo{
    public void bar(){
        //do something
    }
}


Foo foo = new Foo(){
    @Override
    public void bar(){
        //do something else
    }
}

Для меня это имеет смысл, потому что теперь, каждый раз, когда я использую ссылку «foo» для вызова метода bar (), эта ссылка будет использовать замещенную версию bar. В случае с Button нет ссылки на onClick (). Я совершенно запутался в этом.


person Josh Derk    schedule 12.03.2016    source источник
comment
Кнопка содержит ссылку на объект с переопределенным onClick   -  person Kevin DiTraglia    schedule 13.03.2016


Ответы (3)


Если это поможет вашему пониманию, вы можете переписать это:

View.OnClickListener listener = new View.OnClickListener(){
    @Override
    public void onClick(View view){
        //do this
    }
};
myButton.setOnClickListener(listener);

Кнопка удерживает ссылку после того, как слушатель выходит за пределы области видимости, и может вызвать обратный вызов onClick для удерживаемого объекта слушателя.

person Kevin DiTraglia    schedule 12.03.2016
comment
Я думаю, что понял это, и последнее. Вызывает ли метод setOnClickListener (View.OnClickListener L) L.onClick ()? - person Josh Derk; 13.03.2016
comment
Скорее всего, он отключает прослушиватель для вызова метода onClick, когда пользователь нажимает кнопку - person Kevin DiTraglia; 13.03.2016
comment
Другими словами, onClick () вызывается позже, вызывая его через интерфейс? Например, кнопка имеет метод setOnClickListener (View.OnClickListener L), где L - имя переменной для интерфейса OnClickListener. Теперь я могу использовать L.onClick () для вызова onClick (), это кажется правильным? - person Josh Derk; 13.03.2016
comment
Благодаря тонну! это было действительно полезно. - person Josh Derk; 13.03.2016

Я не понимаю, если у нас нет ссылки на этот анонимный класс, потому что он безымянный, как вызывается метод onClick ()?

myButton хранит экземпляр созданного вами анонимного внутреннего класса. myButton, следовательно, может вызвать onClick().

person CommonsWare    schedule 12.03.2016
comment
Хм, но если я попытаюсь вызвать myButton.onClick (); похоже, он не распознает этот метод. - person Josh Derk; 13.03.2016
comment
@JoshDerk: Это потому, что myButton - это Button. myButton удерживает ваш OnClickListener. myButton сам по себе не ваш OnClickListener, а Button не имеет onClick() метода. - person CommonsWare; 13.03.2016
comment
Я думаю разобрался, ваш комментарий мне помог. Я тут кое-что нарисовал. - person Josh Derk; 13.03.2016

Событие onclick вызывается в объекте кнопки, и этот объект делегирует вашему анонимному классу onclick с установленной вами ссылкой.

person Vinicius Zaramella    schedule 12.03.2016