Статьи

Другой способ обработки событий в Android

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

Например, когда пользователь нажимает на представление, подобное кнопке, для этого объекта кнопки вызывается метод onTouchEvent (). Чтобы наше приложение отвечало на событие, мы должны расширить класс и переопределить метод. Но расширение каждого объекта View для обработки такого события нецелесообразно. Каждый класс View в Android предоставляет набор вложенных интерфейсов, называемых слушателями, с обратными вызовами, которые вы можете намного проще определить для обработки события.

1. Определение слушателя программно с помощью метода OnCreate

button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        //do stuff
    }
});
?

Этот метод создаст анонимный класс для каждой кнопки, которую вы создаете. Это рекомендуется, только если у вас меньше слушателей в вашем классе. Но если у нас сложная компоновка экрана с множеством представлений, то написание слушателя программно для каждого представления сделает код грязным. Это дорого и менее читабельно.

2. Установка свойства android: OnClick в XML

?
<Button android:id="@+id/btnView"
    ...............
    ...............
    android:OnClick="btnViewOnClick"/>

Многие люди используют этот метод обработки событий кликов, записывая атрибут OnClick в XML. Но обычно это не является предпочтительным, потому что лучше держать слушателей внутри кода. Внутренне, Android использует концепцию отражения Java за кулисами, чтобы справиться с этим. Он менее читабелен и смущает некоторых разработчиков.

3. Реализация интерфейса OnClickListener в классе Activity и передача ссылки на Button


public class MainActivity extends Activity implements OnClickListener{
    @Override
    public void onClick(View v) {
        //do stuff
    }
 
    protected void onCreate(Bundle savedInstanceState) {
        ...
        button.setOnClickListener(this);
    } 
 				}

Здесь мы реализуем интерфейс OnClickListener на классе активности и передаем собственную ссылку на кнопку. Таким образом, прослушиватель OnClick будет содержать ссылку на объект действия и является тяжелой операцией, чтобы сохранить в себе весь объект действия.

Таким образом, мы можем обработать событие click для всех видов. Тем не менее, нам нужно дифференцировать представления, используя их идентификаторы. Мы можем использовать метод view.getId (), чтобы увидеть, какая кнопка была нажата. Опять же, это предпочтительнее, только когда у нас меньше обращений. Таким образом, все коды обработки событий клика выполняются в одном месте.

По этому пути трудно ориентироваться, потому что вы не можете определить тип слушателя, который вы используете с текущей кнопкой (я знаю, что Eclipse выделит методы, на которые он указывает, но с большим количеством кода, я думаю, будет трудно найти ).

4. Создайте поле с типом OnClickListener

private OnClickListener onClickHandler = new OnClickListener(){
 
    @Override
    public void onClick(View v) {
        //stuff
    }
};
 
protected void onCreate(Bundle savedInstanceState) {
    ...
    button.setOnClickListener(onClickHandler);
}

Рекомендуется создавать локальную переменную с типом OnClickListener. Таким образом, легко ориентироваться и удобнее читать. Но это не мешает вам реализовать три других варианта, представленных выше. У каждого свой взгляд на проблему.