Иногда при создании приложений под 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 |
Любые теги форматирования текста можно использовать совместно друг с другом.