четверг, 28 мая 2015 г.

TextView - отображение текста

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

Кроме того, элемент TextView используется как элемент для отображения данных в контейнерных элементах-списках. От класса TextView наследуется множество других элементов: кнопки, флажки и переключатели — элементы управления, на которых может быть отображен текст. В будущих уроках, мы будем активно применять этот элемент для отображения состояния элементов при обработке событий.

Элемент TextView, так же как и объект View, от которого он наследуется, поддерживает собственное разнообразие XML-атрибутов. Некоторые атрибуты являются определенными только в объекте TextView, но эти атрибуты могут также наследоваться любыми объектами, которые расширяют этот класс.

Свойства для элемента TextView можно задавать как в файле компоновки, так и в программном коде. Например, для отображения текста в TextView в файле компоновки используется атрибут android:text, а в программном коде вызывается метод setText() этого класса.

В целом, XML-словарь элементов пользовательского интерфейса близок к структуре классов и методов этих элементов, где имя элемента соответствует имени класса, а атрибуты элемента — методам этого класса. Фактически, соответствие является часто настолько точным, что легко предположить без обращения к документации Android, какой XML-атрибут передает метод класса или, наоборот, какой метод класса соответствует конкретному XML-элементу. В таблице приведены для примера несколько свойств элемента TextView, чтобы вы могли оценить точность соответствия XML-атрибутов и методов класса TextView.

Соответствие XML-атрибутов и методов в классах представлений

Имя XML-атрибута Соответствующий метод в классе Java
android:text setText()
android:textColor setTextColor()
android:textSize setTextSize()
android:textColorHighlight setHighlightColor()

Однако обратите внимание на последнюю строку в таблице: не всегда XML-словарь идентичен структуре java-классов.

Некоторые атрибуты элемента TextView являются общими по отношению ко всем объектам View, потому что они унаследованы от корневого класса View. Такими атрибутами являются, например, id, layout_width, layout_height, с которыми вы уже познакомились в главе 4.

Если в программном коде мы работаем с данным элементом пользовательского интерфейса, в файле компоновки обязательно определяют идентификатор, например:
android:id="@+id/text1"

где символ @ в начале строки указывает, что синтаксический анализатор XML должен проанализировать и развернуть остальную часть строки идентификатора и определить это выражение как ресурс идентификатора. Символ + означает, что это новое имя ресурса, которое должно быть создано и добавлено к нашим ресурсам в файл R.java, автоматически генерируемый средой Android для проекта.

Требование к уникальности идентификаторов не распространяется на все дерево элементов, но они должны быть уникальны в пределах части дерева (которая нередко может быть и полным деревом, так что лучше создавать совершенно уникальные идентификаторы, если это возможно).

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

android:text="@string/text_hello"

где text_hello — имя ресурса.

В коде программы ссылка на XML-ресурс задается методом setText(), который принимает ссылку на идентификатор ресурса, определенного в файле R.java (автоматически сгенерированном средой разработки), например:

final TextView text = (TextView)findViewById(R.id.text4); 
        text4.setText(R.string.text_hello); 
У элемента TextView есть многочисленные методы и XML-атрибуты для работы с текстом. Например, основные XML-атрибуты, отображающие свойства элемента TextView:

  • android:textSize;
  • android:textStyle;
  • android:textColor.
Атрибут android:textSize задает размер текста. При этом используют несколько единиц измерения:

  • px (pixels) — пикселы;
  • dp (density-independent pixels) — независимые от плотности пикселы. Это абстрактная единица измерения, основанная на физической плотности экрана;
  • sp (scale-independent pixels) — независимые от масштабирования пикселы;
  • in (inches) — дюймы, базируются на физических размерах экрана;
  • pt (points) — 1/72 дюйма, базируются на физических размерах экрана;
  • mm (millimeters) — миллиметры, также базируются на физических размерах экрана.
Обычно при установке размера текста используются единицы измерения sp, которые наиболее корректно отображают шрифты, например:

android:textSize="48sp";
Атрибут android:textStyle представляет стиль текста (нормальный, полужирный, наклонный). Для задания стиля текста используются только следующие константы:

  • normal;
  • bold;
  • italic.
Вот пример установки стиля через атрибуты в файле компоновки:

android:textStyle="bold";
Атрибут android:textColor задает цвет текста. Для задания цвета используются четыре формата в шестнадцатеричной кодировке:

  • #RGB;
  • #ARGB;
  • #RRGGBB;
  • #AARRGGBB,
где R, G, B — соответствующий цвет, А — альфа-канал (alpha-channel), который определяет прозрачность. Значение A, установленное в 0, означает прозрачность 100%. Значение по умолчанию без указания значения A равно 1, т. е. непрозрачно.

Для всех перечисленных ранее атрибутов в классе TextView есть соответствующие методы для чтения или задания соответствующих свойств.

Сейчас мы создадим простое приложение с элементом TextView, в котором рассмотрим различные способы задания его свойств — через атрибуты в файле компоновки и программно, в коде класса, реализующего окно приложения. Для этого создайте новый проект. Для файла компоновки в уроках будет имя main.xml, так, на мой взгляд, удобнее main.xml, а ему соответствует java-класс MainActivity но, если хотите используйте имя по умолчанию  — activity_main.xml). Откройте файл компоновки добавьте компоновку LinearLayout и в ней четыре элемента TextView с идентификаторами text1, text2, text3, text4.
Для text1 задайте текст непосредственно в XML-коде. Для элемента text2 текст задайте через ссылку на строковый ресурс. Можно также задать различный размер, цвет и стиль форматирования текста для элементов text3 и text4. Полный код файла компоновки:

Файл компоновки main.xml
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical"> 
     
    <TextView  
        android:id="@+id/text1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"   
        android:text="Text from res/layout/main.xml"/> 
    <TextView  
        android:id="@+id/text2"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"   
        android:text="@string/text_hello" 
        android:textStyle="bold"/> 
    <TextView  
        android:id="@+id/text3"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:textSize="24sp"  
        android:textStyle="bold"  
        android:textColor="#ABABAB"/> 
    <TextView  
        android:id="@+id/text4"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:textSize="36sp"  
        android:textStyle="italic"/> 
         
</LinearLayout> 
В файле ресурсов strings.xml добавьте после ресурса app_name новый строковый ресурс "Hello, Android!" (листинг 2).

Файл ресурсов strings.xml
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="app_name">TextView Sample</string> 
    <string name="text_hello">Text from res/values/string.xml</string> 
    <string name="action_settings">Settings</string> 
</resources>
В классе MainActivity инициализируйте TextView-объекты text3, text4 и методом setText() задайте для них текст. Полный код класса окна приложения:

Файл класса окна приложения MainActivity.java
package com.example.textview; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
 
public class MainActivity extends Activity { 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        final TextView text3 = (TextView)findViewById(R.id.text3); 
        text3.setText("Text from Activity"); 
         
        final TextView text4 = (TextView)findViewById(R.id.text4); 
        text4.setText(R.string.text_hello); 
    } 
}

Результат должен получиться такой, как на рисунке. Для первого поля текст задается прямо в файле компоновки, для второго — в файле компоновки из строковых ресурсов strings.xml, для третьего — в коде, для четвертого поля — читается в java-коде из файла ресурсов.

Приложение с элементами TextView

В следующем уроке мы рассмотрим работу с элементом ImageView.