Android. Обработчики событий для Button

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

Рассмотрим первый пример в который будет выглядеть так:

 

Добавим кнопку на форму main.xml с помощью GUI конструктора или через 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:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Say hello!"
            android:id="@+id/button"/>
</LinearLayout>

И теперь познакомимся с первым способом создания обработчика на кнопку.

Способ 1.

В main.xml в тег <Button> нужно добавить атрибут android:onClick="<обработчик>" , где <обработчик> это имя метода который и будет выполнять то действие, которое произойдет после нажатия на кнопку.

Пример использования:

public void btnHelloClick(View v){
        Button button = (Button)findViewById(R.id.button);
        button.setText("Hello!");
}

Пример указанный выше демонстрирует событие нашей кнопки.

При использовании этого способа в обязательным условием является использование параметра в методе btnHelloClick(View v) только в этом случае метод будет выполнять действие которое должно повлиять на изменения на форме main.xml.

В данном примере я при нажатии на кнопку изменяю текст внутри кнопки с «Say hello!» на «Hello!».

Способ 2.

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

Добавим новую кнопку на форму и назовем её «Hello World!», после чего 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:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Say hello!"
            android:id="@+id/button"/>
    <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:id="@+id/button1" android:layout_gravity="right|center_vertical"/>
</LinearLayout>

Теперь давайте повесим обработчик на только что созданную кнопку.

final Button buttonHello = (Button) findViewById(R.id.button1);
buttonHello.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button button = (Button)findViewById(R.id.button1);
            button.setText("Hi People!");
        }
});

этот код добавляем в onCreate().

После этого наша текст нашей кнопки с «Hello World!» будет меняться на «Hi People».

Урок создан: 24 января 2013 | Просмотров: 21618 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 14 июня 2013 в 03:51

    Андрей

    Спасибо, помогли сделать первые шаги в разработке под Android.

  • 05 ноября 2013 в 21:33

    Аноним

    Спасибо

  • 09 декабря 2013 в 08:50

    Рома

    Добрый день! Админ нужен твой помощь
    public void onClicktwo(View v) {
    if (MediaPlayer.create(getApplicationContext(), R.raw.sound2)!=null) {
    MediaPlayer.create(getApplicationContext(), R.raw.sound2).start();
    } else {
    MediaPlayer.create(getApplicationContext(), R.raw.sound2).stop();
    }

    }
    }

    цикл не работает что делать ?

  • 09 декабря 2013 в 15:46

    mazaevdmitry

    Спасибо за пример.
    Поясните если я меняю button.setText(«Hi People!»); на button.setText(«Hi DIMA!»);
    запуская проект эмулятор у меня все равно по нажатию показывает Hi People.
    Что надо сделать?

    • 09 декабря 2013 в 18:19

      Александр Барчук

      в setOnClickListener это нужно делать.

      • 10 декабря 2013 в 08:55

        mazaevdmitry

        Из Вашего примера я заменил:

        и в модуле MyActivity.java:

        public class MyActivity extends Activity {
        /**
        * Called when the activity is first created.
        */
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button buttonHello = (Button) findViewById(R.id.button1);
        buttonHello.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        Button button = (Button)findViewById(R.id.button1);
        button.setText(«Hi DIMA!»);
        }
        });
        }

        public void btnHelloClick(View v){
        Button button = (Button)findViewById(R.id.button);
        button.setText(«DIMA!»);
        }
        }

        дальше делал в меню делал Build — Compile MyActivity.java: и Make Project

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

      • 29 марта 2014 в 00:30

        Евгений

        странно, зачем писать Button button = (Button)findViewById(R.id.button1); в OnClick’е, если можно одной строкой на Button1 сразу текст повесить
        public void onClick(View v) {
        Button button = (Button)findViewById(R.id.button1);
        button.setText(«Hi People!»);
        }

  • 22 июля 2014 в 23:41

    neimovirne

    пользуюсь Android Studio. у меня не работает setText. студия пишет вот такую ошибку : non-static method setText cannot be referenced from a static context. как это поправить?

    • 23 июля 2014 в 10:01

      Александр Барчук

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

  • 20 апреля 2015 в 00:18

    Сергей

    Благодарю! Для начинающих, самое оно.

  • 27 апреля 2015 в 23:15

    Диана

    Привет. Не нашла тему про ImageButton :)
    Моя задумка «ImageButton (при нажатии на него воспроизводится звук)» напротив «Text (какой-нибудь текст)» и напротив «ImageButton2(при нажатии на него Text изменяется)». Своего рода словарь с озвучкой..
    Как написать один обработчик на все imagebutton (звук) с разными id. Я так понимаю, что это делается с помощью switch.
    Проблем несколько:
    1. Обработчики для «ImageButton2(при нажатии на него Text изменяется)» получилось написать без проблем с помощью switch и case.
    2. Все эти кнопки находятся на другом совершенно леауте. Я создала проект Navigation Drawer. И все обработчики (как я понимаю) пишутся только в MainActivity. Помогите с кодом для звука. Плиз.
    Обязательно писать в onCreate
    «private void initViews() {
    buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
    mediaPlayer = MediaPlayer.create(this, R.raw.imagine_dragons_radioactive);» ?
    Потому что с переводом я ничего не писала выше. Просто в конце в директории «public class MainActivity extends ActionBarActivity {» был написан мой обработчик.

    ВОТ МОЙ ОБРАБОТЧИК ДЛЯ ИЗМЕНЕНИЯ ТЕКСТА
    public void onTranslate (View view) {
    switch (view.getId()) {
    case R.id.imagebutton1:
    TextView text1 = (TextView)findViewById(R.id.text1);
    text1.setText(«Изменился текст»);
    break;

    case R.id.imagebutton2:
    TextView text2 = (TextView)findViewById(R.id.text2);
    text2.setText(«Изменился текст2″);
    break;
    }
    }
    В этом новичек:)
    Спасибо за ответ.

  • 13 мая 2015 в 17:30

    Aleksander

    Здравствуйте Александр, благодарен вам за то что вы делаете..

    Такой вопрос, допустим есть политическая карта мира, нужно сделать так чтобы при нажатии на определенную область(страна) эта область(страна) подсвечивалась, как бы вы посоветовали это осуществить? Я думал сделать фрейм лейаут и на него накидать пнг картининки всех стран и сделать их в виде зумИмэйджБаттон, но очень сложно иими управлять и сшивать… как бы это реализовать, поможете?

  • 06 октября 2015 в 15:25

    Денис

    Здравствуйте! Ни где не могу найти инфу о том как добавить в приложение кнопку «Добавить в избранное» что бы при нажатии определенный скажем текст добавлялся в избранное, надеюсь вы поможете!