Android. Работа с TextView

Иногда при создании приложений под Android требуется вывести разноцветный текст в одном месте. Чтобы не создавать много TextView для разноцветного текста можно воспользоваться HTML-тегами.

В этой статье мы рассмотрим как можно раскрасить текст, вставить в TextView ссылки, сделать текст жирным, курсивным и т. д.

Раскрашиваем текст

В layout-файле вставляем TextView:

<TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@+id/colorText"
/>

Код MainActivity:

String myColorText = "<font color="#ff0000">My Color Text</font>"; //раскрашиваем текст в красный цвет
TextView tv = (TextView) findViewById(R.id.colorText); tv.setText(Html.fromHtml(myColorText));

Если вы хотите хранить строку в ресурсах:

strings.xml:

<string name="color_text"><![CDATA[<font color="#ff0000">My Color Text</font>]]></string>

Как видите HTML-код должен располагаться между <![CDATA[ и ]]>

MainActivity:

TextView tv = (TextView) findViewById(R.id.colorText);
tv.setText(Html.fromHtml(getResources().getString(R.string.color_text)));

Вставляем ссылки

Для вставки ссылок в TextView используется HTML-тег <a>.
Пример ссылки в HTML:

<a href="http://mysite.ru">Ваш текст</a>

Код MainActivity:

TextView tv = (TextView) findViewById(R.id.colorText); tv.setText(Html.fromHtml(getResources().getString(R.string.my_link)));

strings.xml:

<string name="my_link"><![CDATA[<a href="http://ya.ru">My Link</a>]]></string>

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

tv.setMovementMethod(LinkMovementMethod.getInstance());

Теперь нажатие на ссылку корректно обрабатывается.

Если вы хотите изменить цвет ссылки, то вы можете сделать это двумя способами:

Из кода:

tv.setLinkTextColor(Color.RED);

или как атрибут TextView в xml:

android:textColorLink="#ff0000"

Убираем подчеркивание текста у ссылки

Создадим класс URLSpanNoUnderline и вставим в него следующий код:

public class URLSpanNoUnderline extends URLSpan{

  public URLSpanNoUnderline(String url){ 
     super(url); 
  } 

  @Override
  public void updateDrawState(TextPaint ds){
    super.updateDrawState(ds);
    ds.setUnderlineText(false);
  }
}

В MainActivity вставляем:

void removeUnderline(TextView textView){

  Spannable s = (Spannable)textView.getText();
  URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);

  for (URLSpan span: spans){
    int start = s.getSpanStart(span);
    int end = s.getSpanEnd(span);
    s.removeSpan(span);
    span = new URLSpanNoUnderline(span.getURL());
    s.setSpan(span, start, end, 0);
  }

  textView.setText(s);
}

Осталось вызвать метод removeUnderline и передать на вход TextView.

Пример:

String myLink = "<a href="http://ya.ru">My Link</a>";
TextView tv = (TextView) findViewById(R.id.colorText);
tv.setText(Html.fromHtml(myLink), TextView.BufferType.SPANNABLE);
removeUnderline(tv);

Внимание!
Не забывайте передавать в качестве второго параметра TextView.BufferType.SPANNABLE, а иначе программа выдаст ошибку.

Форматирование текста

Для форматирования текста в HTML существует много тегов. Ниже приведена таблица тегов для форматирования текста:

Код HTML Описание Пример
<b>Текст</b> Жирное начертание текста Текст
<i>Текст</i> Курсивное начертание текста Текст
<u>Текст</u> Подчеркнутый текст Текст
<strike>Текст</strike> Зачеркнутый текст Текст
<sup>Текст</sup> Верхний индекс a2
<sub>Текст</sub> Нижний индекс A2

Любые теги форматирования текста можно использовать совместно друг с другом.

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

1 Comment

  1. Вася Reply

    в статье перепутаны примеры описания в
    Текст Курсивное начертание текста
    Текст Подчеркнутый текст

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *