Top.Mail.Ru

Android. Кнопки (обработка событий)

Класс Button — самый используемый из всех элементов управления. Так как является наследником Textview, то использует многие знакомые нам атрибуты: textColor, textSize и другие.

button1

Если разместить на экране кнопку и нажать на неё, то ничего не произойдёт. Необходимо написать код, который будет выполняться при нажатии. Существует несколько способов обработки нажатий на кнопку. Итак, обработка событий.

Обработка событий

Принцип обработки событий прост: источник генерирует событие и посылает его одному или более слушателям (listener). В этой схеме слушатель просто ожидает до тех пор, пока не получит событие. Как только событие получено, слушатель обрабатывает его и возвращает управление.

В этой модели обработки событий слушатели должны:

  • регистрироваться источником, для того чтобы получать извещения о событиях;
  • иметь методы для обработки событий.

Таким образом, чтобы создавать приложения, взаимодействующие с пользователем, необходимо:

  • зарегистрировать его для требуемого элемента управления,
  • написать обработчик события.

Методы, принимающие и обрабатывающие события, определены в наборе интерфейсов.

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

Всего класс view содержит шесть интерфейсов:

  • OnClickListener;
  • OnLongClickListener;
  • OnFocusChangeListener;
  • OnKeyListener;
  • OnTouchListener;
  • OnCreateContextMenuListener.

Обработка нажатия кнопки

Следующий пример реализует обработчик события onCiick(). Когда выполняется щелчок на кнопке, появляется сообщение, отображающее имя кнопки.

Создайте новый проект MyButton. Откройте файл разметки и разместите три кнопки с идентификаторами button1, button2 и button3, надписями "Button l", "Button 2" и "Button 3", а также две метки с идентификаторами textView1 и textView2 и надписями: у первой ”Нажата кнопка:”, а у второй оставляем значение по умолчанию ”TextView”. Графическая разметка с обозначениями представлена ниже.

button2

Существует несколько способов обработки нажатия на кнопку. Рассмотрим их.

Первый способ

Первый способ разработан для Android и использует атрибут XML – onClick, который записывается в XML-коде элемента управления (в частности и Button), нажатие которого мы собираемся обрабатывать.

android:onClick="onMyClick"

здесь:

android:onClick – атрибут, которому присваивается имя метода обработки события

onMyClick – метод, который будет обрабатывать нажатие. Имя метода должно быть осмысленным. Сам метод записывается в программном коде активности.

В классе активности метод записывается в следующем формате:

public void onMyClick(View v) {

      //здесь записывается код обработки события

}

Попробуем этот метод на практике. Сделайте следующее:

1. Для каждой кнопки в XML-коде кнопки запишете обработчик:

android:onClick="onMyClick"

Обработчик будет один для всех кнопок.

2. В классе public class MainActivity extends Activity {

Запишем один метод onMyClick, который будет обрабатывать все кнопки

public void onMyClick(View v) {

//ищем второй TextView

TextView tv = (TextView)findViewById(R.id.textView2);

// определяем ID элемента и обрабатываем событие

switch (v.getId())

{

case R.id.button1:

tv.setText("Button 1");

break;

case R.id.button2:

tv.setText("Button 2");

break;

case R.id.button3:

tv.setText("Button 3");

break;

}

}

Выполните компиляцию проекта. При нажатии соответствующей кнопки в надписи под кнопками будет отображаться сообщение о нажатии этой кнопки.

Второй способ

Второй способ является традиционным для Java и использует интерфейсы. Для этого в нашем классе необходимо реализовать интерфейс View.OnClickListener. Данный интерфейс содержит единственный метод:

abstract void onClick(View v), который необходимо определить в нашем классе.

Подключение интерфейса выполняется следующим образом:

1. В классе public class MainActivity extends Activity напечатаете implements View.OnClickListener{.

Для написания используйте подсказки Eclipse: наберите слово i и нажмите комбинацию клавиш Ctrl+Space для вывода вариантов продолжения. Eclipse предложит ключевое слово implements, нажимаем Enter. Далее, набираем View, ставим точку, Eclipse предложит список вариантов, выбираем OnClickListener.

После этого будет сообщение об ошибке: подчеркнуто красной волнистой линией имя класса MainActivity, наводим на него курсор и выбираем «Add unimplemented methods».

 button3

Eclipse создаст заготовку метода onClick(View v):

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

} }

2. В методе protected void onCreate(Bundle savedInstanceState) {

выполняем поиск наших кнопок (findViewById) и регистрируем каждую кнопку как слушателя событий с помощью метода setOnClickListener():

final Button button1 = (Button)findViewById(R.id.button1);

final Button button2 = (Button)findViewById(R.id.button2);

final Button button3 = (Button)findViewById(R.id.button3);

button1.setOnClickListener(this);

button2.setOnClickListener(this);

button3.setOnClickListener(this);

Все готово. Осталось написать код обработчика нажатия кнопок.

Для демонстрации второго метода обработки нажатия наших кнопок внесем в наш класс следующие изменения:

Удалим из XML-файла для всех кнопок

android:onClick="onMyClick"

полностью заменим метод public void onMyClick(View v) { …}.

Напишем обработчик onClick(View v). Код этого обработчика повторяет код прежнего обработчика: различия только в названии метода и выводимом тексте.

@Override

public void onClick(View v) {

TextView tv = (TextView)findViewById(R.id.textView2);

switch (v.getId())

{

case R.id.button1:

tv.setText("Подключен интерфейс.Button 1");

break;

case R.id.button2:

tv.setText("Подключен интерфейс.Button 2");

break;

case R.id.button3:

tv.setText("Подключен интерфейс.Button 3");

break;

}

}