Урок #5. TextView, Button, обработка нажатий

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

Урок #5. TextView, Button, обработка нажатий

Привет, дорогой читатель.

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

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

TextView

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

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

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

TextView Android

 

 

Атрибут text

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

Атрибут textStyle

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

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

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

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

TextView textStyle

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

Результат:

TextView textStyle

Атрибут textColor

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

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

  • #RGB
  • #ARGB
  • #AARRGGBB
  • #RRGGBB

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

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

Результат:

TextView textColor

Я не буду подробно останавливаться на этом пункте, так как тут все очень тривиально. Если вы не знакомы с цветовой моделью RGB, можете почитать про нее тут.

Атрибут textSize

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

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

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

Результат:

TextView textSize

Button

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

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

Android Button

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

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

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

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

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

  • Реализовать интерфейс в нашей activity
  • Создать объект, реализующий этот интерфейс

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

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

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

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

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

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

Помните, в одном из предыдущих уроков я упоминал атрибут android:id? Пришло время вернуться к нему.

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

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

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

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

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

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

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

А теперь поговорим о том, как назначить ей обработчик клика.

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

Второй способ — задать обработчик из Java-кода. На нем мы как раз и остановимся.

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

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

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

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

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

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

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

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

Android Button OnClickListener

Один обработчик для нескольких View

Последний пункт, о котором я хотел бы сегодня поговорить — это использование одного обработчика для нескольких View. Давайте дополним задачу: при нажатии на TextView, установим туда текст «Hello, World».

Мы можем назначить тот же обработчик не только на кнопку, но и на TextView:

Однако, тут может возникнуть закономерный вопрос: как же мы узнаем, на какой именно элемент было совершено нажатие?

Если вы внимательно посмотрите на метод onClick в обработчике, то увидите, что туда передается параметр View. Это именно тот View, на который было совершено нажатие.

А у View, соответственно, есть метод getId, по которому мы можем его идентифицировать. Измените код, чтобы он выглядел следующим образом:

Мы просто смотрим, на какой элемент было совершено нажатие, и задаем соответствующий текст. Все очень просто :)

 

Пожалуй, на сегодня все. А в следующем уроке мы поговорим про использование ресурсов в приложении.


Новые уроки добавляются каждый день! Чтобы ничего не пропустить, подпишитесь на нашу группу ВКонтакте, или на рассылку по e-mail (обещаем, спама не будет. честно.)

GET YOUR EMAIL UPDATES

We send out our lovely email newsletter with useful tips and techniques, recent articles and upcoming events. Thousands of readers have signed up already. Get a free WordPress eBook now.
E-Mail