Задание обработчика OnClickListener



Лабораторная №3

TextView, Button. Взаимодействие с элементами интерфейса из Java-кода.

Сегодня мы рассмотрим два новых View — TextView и Button, а так же научимся базовому взаимодействию с UI из Java-кода.

Создайте новый проект по примеру предыдущих уроков, и приступим к обучению!

TextView

TextView, как должно быть понятно из названия, используется для отображения текста. Это, пожалуй, один из самых популярных View в Android.

Измените лэйаут activity_main.xml, чтобы он выглядел вот так:

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:orientation="vertical" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />   </LinearLayout>

Сейчас он будет выглядеть вот так:

Атрибут text

Самый главный атрибут у TextViewandroid:text. Он отвечает за тот текст, который будет отображен в TextView. Вы можете изменить текст в атрибуте на любой другой, и после сборки проекта он изменится и в приложении.

Атрибут textStyle

Мы можем задать стиль текста, подобно тому, как это делается в текстовом редакторе, с помощью атрибута android:textStyle. Этот атрибут может принимать следующие значения:

· normal — обычный текст, используется по умолчанию, если не указывать атрибут textStyle, то будет использован этот стиль.

· bold — жирный текст, выглядит вот так.

· italic — курсив, выглядит вот так.

bold и italic можно комбинировать, тогда получится жирный курсивный текст. Давайте попробуем на примере. Добавьте к TextView атрибут android:textStyle со значением bold.

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:textStyle="bold" />   </LinearLayout>

Результат будет вот таким:

А теперь давайте сделаем жирный курсивный текст. Замените bold на bold|italic:

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:textStyle="bold|italic" />   </LinearLayout>

Результат:

Атрибут textColor

Третий часто используемый атрибут — android:textColor. Как и следует из названия, задает цвет текста.

Может принимать значения в следующих форматах:

· #RGB

· #ARGB

· #AARRGGBB

· #RRGGBB

Чаще всего используют форматы #RRGGBB и #AARRGGBB

К примеру, чтобы сделать текст красным, нужно добавить атрибут android:textColor со значением #ff0000.

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:textColor="#ff0000"/>   </LinearLayout>

Результат:

Атрибут textSize

Опять же, как следует из названия, этот атрибут отвечает за размер текста. При установке размера текста используется не уже видимый вами ранее юнит dp, а sp. Что такое dp и sp мы узнаем в одном из следующих уроков, сейчас лишь запомните, что при задании текста нужно обязательно использовать именно sp.

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

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:textSize="25sp" android:textColor="#ff0000"/>   </LinearLayout>

Результат:

Button

Элемент Button, как вы, наверное, уже догадались, отвечает за отображение кнопки.

На самом деле класс Button — всего лишь наследник TextView, и отличается от нее по большей части только внешним видом. Давайте добавим кнопку в нашу разметку, и посмотрим, что получилось:

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />   <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Click me"/>   </LinearLayout>

Если вы сейчас запустите приложение, то кнопка будет давать визуальный отклик на нажатие, но ничего происходить не будет. Так давайте заставим ее выполнять какое-то действие :)

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

Для начала сформулируем задачу: при нажатии на кнопку изменить текст в TextView на «Hi!».

Теперь немного теории. В Java для обработки каких-либо событий обычно используют интерфейсы, изредка — абстрактные классы. Android — не исключение. Сейчас мы хотим обработать событие нажатия на кнопку. Для этого нам понадобится интерфейс OnClickListener.

Сначала нам нужно создать инстанс этого интерфейса. Для этого есть несколько способов. Рассмотрим два из них:

· Реализовать интерфейс в нашей activity

· Создать объект, реализующий этот интерфейс

В первом случае нужно дописать implements OnClickListener к нашей Activity и добавить метод onClick:

MainActivity.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package ru.android_school.lesson5;   import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View;   public class MainActivity extends AppCompatActivity implements View.OnClickListener {   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }   @Override public void onClick(View v) {   } }

Обратите внимание, что помимо View.OnClickListener существует еще DialogInterface.OnClickListener. Нам нужен именно первый интерфейс (это очень частая ошибка у новичков!).

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

MainActivity.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package ru.android_school.lesson5;   import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View;   public class MainActivity extends AppCompatActivity {   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }     private final View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) {   } };   }

Обработчики лучше размещать в конце класса, и присваивать им модификатор final.

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

Использование findViewById

Помните, в одном из предыдущих уроков мы упоминали атрибут android:id? Пришло время вернуться к нему. Напомним, что он используется для идентификации конкретных View внутри Activity (и других элементов, но об этом потом). В XML-разметке присвоим id к нашим элементам Button и TextView:

activity_main.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ru.android_school.lesson5.MainActivity">   <TextView android:id="@+id/hello_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />   <Button android:id="@+id/hello_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Click me"/>   </LinearLayout>

Теперь мы можем обращаться к ним из кода. Чтобы работать с элементами интерфейса в коде, нужно «присвоить» их некоторому объекту. А чтобы сделать это, нужно их найти. Для этого и существует метод findViewById, которому передается id элемента, а он возвращает нам объект View (либо null, если такого объекта нет). Поскольку возвращается View, нам нужно скастовать его в конкретный тип. Давайте для примера найдем наш TextView:

MainActivity.java

1 2 3 4 5 6 7 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   TextView helloTv = (TextView) findViewById(R.id.hello_tv); }

Будьте внимательны при приведении типов — если ошибетесь, то вылетит ClassCastException.

Вы, конечно же, заметили знакомый id — R.id.hello_tv, но, вероятно, недоумеваете — что это за «R.id.»? Без паники, мы обязательно рассмотрим класс R в следующем уроке, а пока вам нужно лишь знать, что это автоматически генерируемый класс для id и многих других ресурсов, чтобы мы могли работать с ними из Java-кода.

Задание обработчика OnClickListener

Мы научились «находить» нужные нам View. Давайте теперь найдем нашу кнопку:

MainActivity.java

1 2 3 4 5 6 7 8 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   TextView helloTv = (TextView) findViewById(R.id.hello_tv); Button helloBtn = (Button) findViewById(R.id.hello_btn); }

Как видите, процедура аналогична нашему предыдущему «поиску». А теперь поговорим о том, как назначить ей обработчик клика.

Первый способ — это использовать атрибут android:onClick в XML-разметке. Второй способ — задать обработчик из Java-кода. На нем мы как раз и остановимся.

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

MainActivity.java

1 2 3 4 5 6 7 8 9 10 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   TextView helloTv = (TextView) findViewById(R.id.hello_tv); Button helloBtn = (Button) findViewById(R.id.hello_btn);   helloBtn.setOnClickListener(onClickListener); // Обработчик }

Есть еще один способ, более быстрый — с использованием анонимных классов:

MainActivity.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   TextView helloTv = (TextView) findViewById(R.id.hello_tv); Button helloBtn = (Button) findViewById(R.id.hello_btn);   helloBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {   } }); }

Но мы пока что остановимся на предыдущем способе.

Итак, мы создали обработчик и назначили его кнопке. Но при нажатии на нее по-прежнему ничего не происходит. Теперь нужно добавить в нее какой-то код.

Мы хотели изменить текст в TextView, однако, наш обработчик находится за пределами метода onCreate, и поэтому объект helloTv ему недоступен. Чтобы сделать TextViewдоступным из обработчика, нужно сделать его членом класса. Измените код Activity, чтобы он выглядел так:

MainActivity.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package ru.android_school.lesson5;   import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView;   public class MainActivity extends AppCompatActivity {   private TextView helloTv;   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   helloTv = (TextView) findViewById(R.id.hello_tv); Button helloBtn = (Button) findViewById(R.id.hello_btn);   helloBtn.setOnClickListener(onClickListener); }     private final View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) {   } };   }

Отлично, теперь мы можем обращаться к helloTv в пределах всего кода внутри MainActivity.

Остался последний шаг — задать текст. Программно задать текст в TextView можно при помощи метода setText(). Давайте сделаем это:

MainActivity.java

1 2 3 4 5 6 private final View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { helloTv.setText("Hi!"); } };

Если теперь вы запустите приложение и нажмете на кнопку, текст волшебным образом изменится на «Hi!».


Дата добавления: 2019-01-14; просмотров: 167; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!