Элемент Button
Класс Button — самый простой из всех элементов управления и при этомсамый используемый. Чаще всего кнопка требует написания кода обработки события нажатия onClick().
Напишем программу, которая реализует обработчик события нажатия на кнопку. В программе будут две кнопки и текстовое поле TextView. Когда пользователь нажимает кнопку, в элемент TextView будет выводиться сообщение о событии.
Создайте в новый проект, откройте файл компоновки и создайте компоновку LinearLayout и в ней две кнопки с идентификаторами button1 и button2 и надписями Button 1 и Button 2.
Файл компоновки main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Button 1"/> <Button android:id="@+id/button2" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Button 2" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Event:" android:textStyle="bold"/> </LinearLayout>
Теперь в классе ButtonActivity подключим обработчики событий для кнопок.
Обработка событий
В программе нам потребуется организовать взаимодействие элементов с пользователем. Для этого необходимо определить обработчик события и зарегистрировать его для данного элемента.Класс View содержит коллекцию вложенных интерфейсов, называемых On...Listener(), в каждом из которых объявлен единственный абстрактный метод. Этот метод необходимо переопределить в вашем классе. Его будет вызывать система Android, когда c экземпляром View, к которому был подсоединен слушатель события, будет взаимодействовать пользователь.
Всего класс View содержит шесть вложенных интерфейсов:
- OnClickListener;
- OnLongClickListener;
- OnFocusChangeListener;
- OnKeyListener;
- OnTouchListener;
- OnCreateContextMenuListener.
button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mText.setText("Click on Button"); } });
Реализуем обработчики событий в нашем классе MainActivity:
Файл класса окна приложения MainActivity.java
package com.example.button1; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView mText = (TextView)findViewById(R.id.text); final Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mText.setText("Click on First Button"); } }); final Button button2 = (Button)findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mText.setText("Click on Second Button"); } }); } }
Выполните компиляцию проекта. При нажатии пользователем соответствующей кнопки в надписи под кнопками будет отображаться сообщение о нажатии этой кнопки:
Существуют и другие варианты обработки событий. В предыдущем примере обработчики событий были реализованы внутри тела метода onCreate(). Наличие множества вложенных блоков кода создает трудности его восприятия, особенно другими программистами, поэтому желательно выносить обработчики событий за пределы метода onCreate(). В методе setOnClickListener() в качестве параметра передается имя метода обработчика, который мы должны будем реализовать:
button.setOnClickListener(button_click);
Далее мы описываем реализацию этого метода:
public OnClickListener button_click = new OnClickListener() { @Override public void onClick(View v) { // Действия по обработке события } };
Внесите в класс MainActivity изменения, как показано в листинге 8.3, и скомпилируйте проект. Результат не изменился, но код класса стал легче для восприятия.
Подключение обработчиков событий. 2-й вариант
package com.example.button2; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private TextView text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView)findViewById(R.id.text); final Button button1 = (Button)findViewById(R.id.button1); final Button button2 = (Button)findViewById(R.id.button2); button1.setOnClickListener(button1_click); button2.setOnClickListener(button2_click); } public OnClickListener button1_click = new View.OnClickListener() { public void onClick(View v) { text.setText("Click on First Button"); } }; public OnClickListener button2_click = new View.OnClickListener() { public void onClick(View v) { text.setText("Click on Second Button"); } }; }
Наконец, есть еще способ, более эффективный, чем предыдущие, — реализовать обработку однотипных событий всех элементов в одном методе. Для этого в нашем классе необходимо реализовать интерфейс View.OnClickListener:
public class MainActivity extends Activity implements View.OnClickListener
Этот интерфейс содержит единственный метод:
abstract void onClick(View v)
который необходимо определить в нашем классе ButtonActivity. Если определен идентификатор элемента (например, в файле компоновки Activity), то можно написать обработку событий элементов в операторе switch, получив ID элемента методом getId():
@Override
public void onClick(View v) {
switch (v.getId()) {
// Определяем ID элемента и обрабатываем событие
}
}
Если в методе onClick() обрабатывается только одно событие, структура switch не нужна.
Теперь используем данный способ обработки событий в нашем приложении, изменив код класса ButtonActivity.
Подключение обработчиков событий. 3-й вариант
package com.example.button3; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements View.OnClickListener { private TextView text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView)findViewById(R.id.text); final Button button1 = (Button)findViewById(R.id.button1); final Button button2 = (Button)findViewById(R.id.button2); button1.setOnClickListener(this); button2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: text.setText("Click on First Button"); break; case R.id.button2: text.setText("Click on Second Button"); break; } } }
Такой вариант написания обработки однотипных событий, является наиболее удобным в том случае, если у вас несколько однотипных элементов управления. Он лучше структурирует код и делает его более понятным для восприятия. Кроме того, при обработке меню используется такой же стиль написания кода.
Код можно еще упростить, если вынести объявление обработчика события кнопок в файл компоновки. Для этого надо добавить для каждой кнопки android:onClick="onClick".
Подключение обработчиков событий. 4-й вариант
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_height="wrap_content" android:text="Button 1" android:onClick="onClick" android:layout_width="fill_parent"/> <Button android:id="@+id/button2" android:layout_height="wrap_content" android:text="Button 2" android:onClick="onClick" android:layout_width="fill_parent"/> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Event:" android:textStyle="bold"/> </LinearLayout>В классе MainActivity нам уже не понадобится для каждой кнопки подключать обработчик setOnClickListener.
Класс MainActivity. 4-й вариант
package com.example.button4; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity implements View.OnClickListener { private TextView text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView)findViewById(R.id.text); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: text.setText("Click on First Button"); break; case R.id.button2: text.setText("Click on Second Button"); break; } } }
Комментариев нет:
Отправить комментарий