Java android обработчик нажатия

Урок 9. Обработчики событий на примере Button.

В layout-файл main.xml напишем следующее и сохраним:

У нас есть TextView с текстом и две кнопки: OK и Cancel. Мы сделаем так, чтобы по нажатию кнопки менялось содержимое TextView. По нажатию кнопки OK – будем выводить текст: «Нажата кнопка ОК», по нажатию Cancel – «Нажата кнопка Cancel».

Открываем MainActivity.java. Описание объектов вынесем за пределы метода onCreate. Это сделано для того, чтобы мы могли из любого метода обращаться к ним. В onCreate мы эти объекты заполним с помощью уже пройденного нами метода findViewById. В итоге должен получиться такой код:

public class MainActivity extends Activity < TextView tvOut; Button btnOk; Button btnCancel; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); // найдем View-элементы tvOut = (TextView) findViewById(R.id.tvOut); btnOk = (Button) findViewById(R.id.btnOk); btnCancel = (Button) findViewById(R.id.btnCancel); >>

Обновляем секцию import (CTRL+SHIFT+O). Объекты tvOut, btnOk и btnCancel соответствуют View-элементам экрана и мы можем с ними работать. Нам надо научить кнопку реагировать на нажатие. Для этого у кнопки есть метод setOnClickListener (View.OnClickListener l). На вход подается объект с интерфейсом View.OnClickListener. Именно этому объекту кнопка поручит обрабатывать нажатия. Давайте создадим такой объект. Код продолжаем писать в onCreate:

OnClickListener oclBtnOk = new OnClickListener() < @Override public void onClick(View v) < // TODO Auto-generated method stub >>;

Eclipse подчеркивает OnClickListener красной линией

т.к. пока не знает его. Необходимо обновить секцию import. Жмем CTRL+SHIFT+O, Eclipse показывает нам, что он знает два интерфейса с именем onClickListener и предлагает выбрать. Нам нужен View.OnClickListener, т.к. метод кнопки setOnClickListener принимает на вход именно его.

Читайте также:  Border height and width in css

Итак, мы создали объект oclBtnOk, который реализует интерфейс View.OnClickListener. Объект содержит метод onClick – это как раз то, что нам нужно. Именно этот метод будет вызван при нажатии кнопки. Мы решили, что по нажатию будем выводить текст: «Нажата кнопка ОК» в TextView (tvOut). Реализуем это.

tvOut.setText("Нажата кнопка ОК");

Обработчик нажатия готов. Осталось «скормить» его кнопке с помощью метода setOnClickListener.

btnOk.setOnClickListener(oclBtnOk);

В итоге должен получится такой код:

public class MainActivity extends Activity < TextView tvOut; Button btnOk; Button btnCancel; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); // найдем View-элементы tvOut = (TextView) findViewById(R.id.tvOut); btnOk = (Button) findViewById(R.id.btnOk); btnCancel = (Button) findViewById(R.id.btnCancel); // создаем обработчик нажатия OnClickListener oclBtnOk = new OnClickListener() < @Override public void onClick(View v) < // Меняем текст в TextView (tvOut) tvOut.setText("Нажата кнопка ОК"); >>; // присвоим обработчик кнопке OK (btnOk) btnOk.setOnClickListener(oclBtnOk); > >

Все сохраняем и запускаем. Жмем на кнопку ОК и видим. Что текст изменился

Нажатие на Cancel пока ни к чему не приводит, т.к. для нее мы обработчик не создали и не присвоили. Давайте сделаем это аналогично, как для кнопки OK. Сначала мы создаем обработчик:

OnClickListener oclBtnCancel = new OnClickListener() < @Override public void onClick(View v) < // Меняем текст в TextView (tvOut) tvOut.setText("Нажата кнопка Cancel"); >>;

Потом присваиваем его кнопке:

btnCancel.setOnClickListener(oclBtnCancel);

Сохраняем, запускаем, проверяем. Обе кнопки теперь умеют обрабатывать нажатия.

Давайте еще раз проговорим механизм обработки событий на примере нажатия кнопки. Сама кнопка обрабатывать нажатия не умеет, ей нужен обработчик (его также называют слушателем — listener), который присваивается с помощью метода setOnClickListener. Когда на кнопку нажимают, обработчик реагирует и выполняет код из метода onClick. Это можно изобразить так:

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

— создаем обработчик
— заполняем метод onClick
— присваиваем обработчик кнопке

и система обработки событий готова.

— научимся использовать один обработчик для нескольких View-элементов
— научим Activity выступать в качестве обработчика

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

Источник

Button

Follow us on Telegram Follow us on Youtube

Button (Кнопка) — это компонент, который может быть нажат пользователем для подтверждения какого-либо действия. Она является одним из основных элементов интерфейса и имеет большое значение в приложении.

Кнопка состоит из текста или иконки (или текста с иконкой), который сообщает пользователю, какое действие произойдёт после нажатия.

Поскольку Button является наследником TextView, ему доступны атрибуты для работы с текстом, такие как android:textColor, android:textAlignment и другие.

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

1. Атрибут android:onClick

Когда вы создаёте Button, вы можете в XML добавить ему атрибут android:onClick. Создадим на активности простую кнопку:

Теперь добавим этой кнопке атрибут android:onClick и в значении напишем имя метода, который будет обрабатывать нажатие. Если в классе активности этого метода нет, Android Studio скажет, что такой метод не найден.

В этом случае можно установить курсор на имени метода и нажать комбинацию Alt + Enter, затем выбрать опцию Create, после чего студия сама создаст в классе активности метод с таким названием. Либо можно перейти в класс активности и вручную создать этот метод, передав ему в параметры View.

Перейдя в MainActivity, можно увидеть, что теперь там есть метод testClick(View view). Внутри него уже писаться код, который должен выполняться после нажатия на кнопку.

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

  • быть public
  • возвращать void
  • принимать в качестве единственного параметра экземпляр класса View
public void testClick(View view) < // пишем код обработки нажатия здесь Toast.makeText(this, "Clicked", Toast.LENGTH_LONG).show(); >

2. Метод setOnClickListener()

Кроме XML, обработчик нажатия можно задать программно в коде активности. Аналогично создадим кнопку, однако на этот раз укажем идентификатор с помощью атрибута android:id.

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

public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_test = findViewById(R.id.btn_test); btn_test.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < // пишем код обработки нажатия здесь Toast.makeText(getApplicationContext(), "Clicked", Toast.LENGTH_LONG).show(); >>); > >

3. Интерфейс OnClickListener

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

Чтобы добавить в класс интерфейс, нужно воспользоваться ключевым словом implements. Подключим интерфейс OnClickListener к нашей активности.

public class MainActivity extends AppCompatActivity implements View.OnClickListener . >

Android Studio выдаст сообщение, что мы должны реализовать метод, описанный в подключенном интерфейсе.

Поставим курсор на выделенную строку и нажмём комбинацию Alt + Enter, затем выберем опцию Implement methods.

Появится окно, в котором будет предложен список методов, которые мы хотим реализовать. В данном случае нам нужен метод onClick().

Теперь у нас на активности есть соответствующий метод.

@Override public void onClick(View v)

Сделаем обработку нажатия. Аналогично предыдущему способу, нам понадобится кнопка с идентификатором.

Вернёмся в метод onClick(). В этот метод будут попадать нажатия кнопок на активности, поэтому нам нужно добавить здесь проверку на идентификатор. Добавим следующий код.

@Override public void onClick(View v) < switch (v.getId())  case R.id.btn_test:  // пишем код обработки нажатия здесь Toast.makeText(getApplicationContext(), "Clicked", Toast.LENGTH_LONG).show(); break; > > >

Если у вас на активности всего одна кнопка, проверка с помощью switch необязательна, однако если вы хотите обрабатывать в этом методе нажатия нескольких кнопок, то нужно будет проверять идентификатор и, исходя из этого, выполнять соответствующие операции.

Теперь нужно только привязать к кнопке слушатель как мы это делали во втором способе. Единственное отличие — вместо создания нового слушателя мы будем указывать текущий.

@Override protected void onCreate(Bundle savedInstanceState)

Состояния кнопки

Кроме всего прочего, у Button есть возможность отслеживать состояния нажатий. Делается это с помощью селектора.

У селектора есть следующие атрибуты, определяющие состояние элемента:

  • android:state_pressed — когда пользователь нажимает на элемент.
  • android:state_focused — когда на элементе установлен фокус ввода.
  • android:state_enabled — когда элемент доступен.
  • android:state_checked — когда элемент в списке был отмечен.

Создадим селектор, который при нажатии на кнопку будет менять её цвет, со следующим кодом.

Источник

Оцените статью