Как сделать подчеркнутый textview

Обновлено: 08.07.2024

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

Я реализовал весь, необходимый мне функционал и выяснил ещё несколько довольно интересных вещей, столкнувшись с некоторым количеством подводных камней (впрочем, не очень острых). Можно сказать, всё нижеописанное — руководство по созданию достаточно мощной справочной системы в своём приложении практически даром.

Задачи

В данном примере мы создадим приложение с двумя Activity, одна из которых содержит TextView, исполняющий роль браузера, из которого, в частности, можно вызвать вторую Activity, демонстрирующую работу с параметрами вызова. Мы выясним, каким образом можно создавать страницы текста с разметкой и изображениями и связывать их ссылками.

Содержимое страниц берётся из строк в ресурсах приложения, а изображения являются drawable-ресурсами. Небольшие изменения в коде позволят использовать другие расположения.


Создание приложения

Любым удобным нам способом создаём обычное приложение:

Немного пояснений к манифесту. Если с первой Activity всё понятно, вторая (AnotherActivity) содержит некие дополнительные описатели.

Раздел intent-filter содержит описатели того, каким образом и при каких обстоятельствах будет происходить запуск Activity.

означает, что можно запустить Activity ссылкой вида activity-run://AnotherActivityHost?params.

Значения action и category необходимы системе для того чтобы обнаружить и запустить Activity.

Подготовка ресурсов

Строки, содержащие разметку, должны иметь аттрибут formatted со значением false, а содержимое должно передаваться в блоке CDATA, чтобы у компилятора не было претензий к разметке и специальным символам. В данном примере признаком статьи будет префикс article_ в названии строки.

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

Изображения могут быть формата jpg, png или gif без анимации. Анимированный gif отображается статичной картинкой. Расположение стандартное для ресурсов, для дисплеев разной плотности можно подготовить свой вариант картинки. В данном примере все изображения находятся в drawable-nodpi


Как всё работает

Рассмотрим некоторые части кода подробно.

TextView используемый нами в качестве браузера, требует особой инициализации:

tvContent.setLinksClickable(true); указывает на то, что ссылки в данном элементе реагируют на нажатие.

tvContent.setMovementMethod(new LinkMovementMethod()); назначает способ навигации по элементу. Использованный нами LinkMovementMethod интересен сам по себе и, возможно, заслуживает отдельной статьи. Я лишь скажу, что при необходимости более полного контроля можно создать его наследника, переопределенные методы которого позволят отслеживать все действия со ссылками в элементе.


В данном методе происходит получение строки по идентификатору из строковых ресурсов, её преобразование из HTML в специальный объект Spanned, затем ещё одно преобразование в Spannable и установка в TextView в качестве содержимого. Всё это кажется довольно громоздким, но тому есть причины.

В TextView, на мой взгляд, странный порядок обработки спанов — с конца списка. При естественном расположении спанов после преобразования строки из HTML, изменения внешнего вида вложенных спанов перекрываются свойствами спанов, их содержащих. Для нормального отображения приходится буквально выворачивать маркировку наизнанку с помощью метода revertSpanned:


Определение обработчика ссылок на изображения минималистично и призвано загружать только картинки из ресурсов. Поскольку мы рассматриваем вариант справочной системы, я посчитал, что этого будет достаточно. С вашего позволения, я не буду цитировать его. Если вы хотите большего, можно обратиться, например, к данной статье.

Более интересен нам будет Html.TagHadler:

Здесь у нас происходит несколько интересных вещей.

При преобразовании из HTML в Spanned методом Html.fromHtml, обрабатываются тэги br , p , div , em , b , strong , cite , dfn , i , big , small , font , blockquote , tt , a , u , sup , sub , h1. h6 и img . В случае, если тэг не опознан, вызывается Html.TagHandler (если, конечно, он передан в вызов).

К сожалению, у меня не получилось малой кровью добиться центрования отдельных строк или абзацев, а встроенной возможности для этого не существует. Также, нельзя прочесть атрибуты тэга из xmlReader, поскольку он реализован не полностью. По этой причине пришлось изобретать свой способ передачи параметров: значение является частью тега. В нашем примере таким образом передаётся значение цвета в тэге color, преобразовываемом в ParameterizedSpan. Получается что-то вроде красный . Это достаточно ограниченный и не очень удобный способ, но иногда лучше такой, чем никакого.


Этот код делает следующее: В случае, если передан открывающий Span, он добавляется к концу строки в текущем её виде. В случае, если Span закрывающий, мы находим в строке его открывающий аналог, запоминаем его положение, затем удаляем и добавляем новый, но уже с информацией о начальном положении и длине.

Мы завершили рассмотрение класса Activity, являющегося основным модулем нашего приложения. Теперь рассмотрим вспомогательные классы.


Это Span общего назначения и с его помощью можно задать большинство параметров стиля текста. Его можно использовать как базу для создания стилей текста из собственных тэгов.


Этот класс описывает элемент, который по нажатию на него обеспечивает переход к статье, чей идентификатор является его параметром. Здесь я применил производное от способа, описанного мной ранее: сам тэг является собственным параметром, а его класс определяется префиксом article_. Поднимемся выше, к описанию Html.TagHandler:


Обработчик тэгов, увидев тэг, начинающийся на article_, создаёт ArticleSpan, задавая ему в качестве параметра название тэга. Элемент, при нажатии на него, вызывает метод MainActivity.setArticle, после чего в TextView устанавливается новый текст.


Здесь реализован элемент, получающий параметр явно и отдельно от своего имени. Претензия на своего рода стандарт именования тэгов, раз уж нельзя передавать атрибуты.

Конечно, всё описанное является вариациями одного принципа, каждый выберёт то, что ему удобнее.

Вызов Activity

В HTML мы видим следующее:

При нажатии на ссылку, происходит вызов AnotherActivity с передачей параметров в Intent. Эти параметры можно получить и использовать:

Использованные материалы

Следующие материалы очень ускорили создание данной статьи, да и, чего уж там, сделали его вообще возможным:

У меня есть TextView в моем приложении, и пользователь может установить любой текст в этом TextView, используя HTML из настроек приложения. Пользователь должен иметь возможность устанавливать положение частей текста в этом TextView с помощью тегов HTML. Но TextView не поддерживает тег 'table' или.

Я хочу пунктирное подчеркивание ниже SpannableString Например вот моя струна Hello, How are you? Я хочу разработать пунктирное подчеркивание ниже How слова, так как же его установить? Если я добавлю кликабельность, то это даст мне подчеркивание, но я хочу пунктирное подчеркивание ниже How слова.

Для этого вы должны использовать SpannableString :

Обновление : Вы можете сослаться на мой ответ о подчиненных TextView здесь всеми возможными способами.

Ниже приведены некоторые подходы к подчеркиванию текста в android:

1-й Подход

Вы можете определить свою строку в strings.xml

И используйте эту строку в своем файле xml

Или вы можете использовать эту строку в своем действии/фрагменте

2-й Подход

Чтобы подчеркнуть текст в TextView, вы можете использовать SpannableString

3-й Подход

Вы можете использовать метод setPaintFlags из TextView, чтобы подчеркнуть текст TextView.

4-й Подход

Или

Примечание :

Если вы добавили эту строку android:textAllCaps="true" в свой макет, то ничего из вышеперечисленного работать не будет. Для этого вы должны определить свою строку в шапках, а затем любой из вышеперечисленных подходов.

Используйте это

Android поддерживает форматирование строк с использованием тегов HTML в строках xml. Таким образом, будет работать следующее:

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

Обновление:

Чтобы еще больше расширить ответ, в документации говорится:

. методы format(String, Object. ) и getString(int, Object. ) удаляют всю информацию о стиле из строки. . Обходной путь к этому заключается в написании тегов HTML с экранированными сущностями, которые затем восстанавливаются с помощью fromHtml(строка) после форматирования

Например, результирующая строка из следующего фрагмента кода не будет отображаться как содержащая подчеркнутые элементы:

Однако результат следующего фрагмента будет содержать подчеркивания:

У меня есть вопрос о TextView. Я хочу, чтобы textview изменил свой стиль при нажатии на подчеркивание. Например, изменение цвета с помощью селектора. Есть ли какой-нибудь способ сделать это?

Как установить отступ для части текста внутри TextView? В частности, я хочу дать левое заполнение части текста внутри textview. Кроме того, текст внутри textview - это данные, полученные с сервера. Любая Помощь Будет Оценена По Достоинству. Спасибо!

Попробуйте это,

вы почти на месте: просто не вызывайте toString() на Html.fromHtml() , и вы получите охватывающий объект, который выполнит эту работу ;)

Простой и легкий способ отображения подчеркивания в TextView -это:

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

Он будет работать, даже если вы установите android:textAllCaps="true"

Не нужно использовать HTML свойств, давайте сосредоточимся на java xD У меня была та же проблема, я нашел способ сделать это в java:

Я считаю, что вам нужно использовать CharSequence . Вы можете найти пример здесь .

Вы можете сделать это, как:

Надеюсь, это поможет

Вы можете легко добавить вид с высотой 1dp, выравнивая начало и конец TextView, прямо под ним. Вы также можете использовать marginTop с отрицательным значением, чтобы сделать подчеркивание ближе к TextView. Если вы используете свой TextView и нижнюю часть внутри относительного макета, это будет намного проще для выравнивания. вот вам пример:

В моем файле sign_in.xml я использовал это:

В моем файле SignIn.java я использовал это:

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

Похожие вопросы:

Мне удалось сделать подчеркивание в моем textview. Вот код : txtOrder1.setPaintFlags(txtOrder1.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); Теперь я хочу убрать это подчеркивание. Возможно ли это ?

Я хочу знать, как установить подчеркивание текста на TextView в android? Пожалуйста, обратите внимание, что у меня нет возможности установить strings.xml с предварительно заполненными строками, есть.

У меня есть строка в моем EditText, и в этой строке есть ссылка URL. Поэтому я хочу, чтобы эта ссылка имела подчеркивание и синий цвет как здравый смысл. Теперь я могу добавить подчеркивание с.

У меня есть TextView в моем приложении, и пользователь может установить любой текст в этом TextView, используя HTML из настроек приложения. Пользователь должен иметь возможность устанавливать.

Я хочу пунктирное подчеркивание ниже SpannableString Например вот моя струна Hello, How are you? Я хочу разработать пунктирное подчеркивание ниже How слова, так как же его установить? Если я добавлю.

У меня есть вопрос о TextView. Я хочу, чтобы textview изменил свой стиль при нажатии на подчеркивание. Например, изменение цвета с помощью селектора. Есть ли какой-нибудь способ сделать это?

Как установить отступ для части текста внутри TextView? В частности, я хочу дать левое заполнение части текста внутри textview. Кроме того, текст внутри textview - это данные, полученные с сервера.

Я видел много вопросов относительно удаления подчеркивания для автолинка textview. Но для меня я не могу удалить подчеркивание для нормального textview. Я поставил подчеркивание на.

Как я могу удалить синее подчеркивание, которое появляется на TextView-Android. Я в порядке с этим на TextField - но в многострочном TextView-выглядит странно.

У меня есть TextView для отображения баланса кошелька пользователя в моем приложении. Для того чтобы установить индикатор ошибки на низкий баланс, я добавил виджет. EditText стиль к TextView . Мои.

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

Я реализовал весь, необходимый мне функционал и выяснил ещё несколько довольно интересных вещей, столкнувшись с некоторым количеством подводных камней (впрочем, не очень острых). Можно сказать, всё нижеописанное — руководство по созданию достаточно мощной справочной системы в своём приложении практически даром.

Задачи

В данном примере мы создадим приложение с двумя Activity, одна из которых содержит TextView, исполняющий роль браузера, из которого, в частности, можно вызвать вторую Activity, демонстрирующую работу с параметрами вызова. Мы выясним, каким образом можно создавать страницы текста с разметкой и изображениями и связывать их ссылками.

Содержимое страниц берётся из строк в ресурсах приложения, а изображения являются drawable-ресурсами. Небольшие изменения в коде позволят использовать другие расположения.


Создание приложения

Любым удобным нам способом создаём обычное приложение:

Немного пояснений к манифесту. Если с первой Activity всё понятно, вторая (AnotherActivity) содержит некие дополнительные описатели.

Раздел intent-filter содержит описатели того, каким образом и при каких обстоятельствах будет происходить запуск Activity.

означает, что можно запустить Activity ссылкой вида activity-run://AnotherActivityHost?params.

Значения action и category необходимы системе для того чтобы обнаружить и запустить Activity.

Подготовка ресурсов

Строки, содержащие разметку, должны иметь аттрибут formatted со значением false, а содержимое должно передаваться в блоке CDATA, чтобы у компилятора не было претензий к разметке и специальным символам. В данном примере признаком статьи будет префикс article_ в названии строки.

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

Изображения могут быть формата jpg, png или gif без анимации. Анимированный gif отображается статичной картинкой. Расположение стандартное для ресурсов, для дисплеев разной плотности можно подготовить свой вариант картинки. В данном примере все изображения находятся в drawable-nodpi


Как всё работает

Рассмотрим некоторые части кода подробно.

TextView используемый нами в качестве браузера, требует особой инициализации:

tvContent.setLinksClickable(true); указывает на то, что ссылки в данном элементе реагируют на нажатие.

tvContent.setMovementMethod(new LinkMovementMethod()); назначает способ навигации по элементу. Использованный нами LinkMovementMethod интересен сам по себе и, возможно, заслуживает отдельной статьи. Я лишь скажу, что при необходимости более полного контроля можно создать его наследника, переопределенные методы которого позволят отслеживать все действия со ссылками в элементе.


В данном методе происходит получение строки по идентификатору из строковых ресурсов, её преобразование из HTML в специальный объект Spanned, затем ещё одно преобразование в Spannable и установка в TextView в качестве содержимого. Всё это кажется довольно громоздким, но тому есть причины.

В TextView, на мой взгляд, странный порядок обработки спанов — с конца списка. При естественном расположении спанов после преобразования строки из HTML, изменения внешнего вида вложенных спанов перекрываются свойствами спанов, их содержащих. Для нормального отображения приходится буквально выворачивать маркировку наизнанку с помощью метода revertSpanned:


Определение обработчика ссылок на изображения минималистично и призвано загружать только картинки из ресурсов. Поскольку мы рассматриваем вариант справочной системы, я посчитал, что этого будет достаточно. С вашего позволения, я не буду цитировать его. Если вы хотите большего, можно обратиться, например, к данной статье.

Более интересен нам будет Html.TagHadler:

Здесь у нас происходит несколько интересных вещей.

При преобразовании из HTML в Spanned методом Html.fromHtml, обрабатываются тэги br , p , div , em , b , strong , cite , dfn , i , big , small , font , blockquote , tt , a , u , sup , sub , h1. h6 и img . В случае, если тэг не опознан, вызывается Html.TagHandler (если, конечно, он передан в вызов).

К сожалению, у меня не получилось малой кровью добиться центрования отдельных строк или абзацев, а встроенной возможности для этого не существует. Также, нельзя прочесть атрибуты тэга из xmlReader, поскольку он реализован не полностью. По этой причине пришлось изобретать свой способ передачи параметров: значение является частью тега. В нашем примере таким образом передаётся значение цвета в тэге color, преобразовываемом в ParameterizedSpan. Получается что-то вроде красный . Это достаточно ограниченный и не очень удобный способ, но иногда лучше такой, чем никакого.


Этот код делает следующее: В случае, если передан открывающий Span, он добавляется к концу строки в текущем её виде. В случае, если Span закрывающий, мы находим в строке его открывающий аналог, запоминаем его положение, затем удаляем и добавляем новый, но уже с информацией о начальном положении и длине.

Мы завершили рассмотрение класса Activity, являющегося основным модулем нашего приложения. Теперь рассмотрим вспомогательные классы.


Это Span общего назначения и с его помощью можно задать большинство параметров стиля текста. Его можно использовать как базу для создания стилей текста из собственных тэгов.


Этот класс описывает элемент, который по нажатию на него обеспечивает переход к статье, чей идентификатор является его параметром. Здесь я применил производное от способа, описанного мной ранее: сам тэг является собственным параметром, а его класс определяется префиксом article_. Поднимемся выше, к описанию Html.TagHandler:


Обработчик тэгов, увидев тэг, начинающийся на article_, создаёт ArticleSpan, задавая ему в качестве параметра название тэга. Элемент, при нажатии на него, вызывает метод MainActivity.setArticle, после чего в TextView устанавливается новый текст.


Здесь реализован элемент, получающий параметр явно и отдельно от своего имени. Претензия на своего рода стандарт именования тэгов, раз уж нельзя передавать атрибуты.

Конечно, всё описанное является вариациями одного принципа, каждый выберёт то, что ему удобнее.

Вызов Activity

В HTML мы видим следующее:

При нажатии на ссылку, происходит вызов AnotherActivity с передачей параметров в Intent. Эти параметры можно получить и использовать:

Использованные материалы

Следующие материалы очень ускорили создание данной статьи, да и, чего уж там, сделали его вообще возможным:

Как подчеркнуть текст в XML-файле? Я не могу найти вариант textStyle .

Если вы используете XML-файл string resource (поддерживает HTML-теги), это можно сделать с помощью и .

Если вы хотите подчеркнуть что-то из использования кода:

Надеюсь, это поможет

Если это не работает, то

Прежде всего перейдите к String.XML-файл

вы можете добавить любые HTML атрибуты, такие как, Курсив или полужирный или подчеркивание здесь.

Чтобы завершить ответ Bhavin.
Например, чтобы добавить подчеркивание или перенаправление.

Я использовал ниже метод, это работа для меня. ниже приведен пример для кнопки, но мы можем использовать в TextView, а также.

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

Отмечать

Использование textAllCaps со строкой (login_change_settings), содержащей разметку; разметка будет удалена преобразованием caps

Преобразование textAllCaps text в конечном итоге вызовет toString на CharSequence, который имеет чистый эффект удаления любой разметки, такой как . Эта проверка ищет использование строк, содержащих разметку, которая также указывает textAllCaps=true.

Другой способ сделать это-создать пользовательский компонент, расширяющий TextView. Это хорошо для случаев, когда вам нужно иметь несколько подчеркнутых TextViews.

Вот код для компонента:

И как использовать его в xml:

В Android TextView можно использовать различные способы подчеркивания текста.

1. This is my underlined text
или

2.То же самое можно сделать программно.

3.Это можно сделать, создав SpannableString и затем установив его как TextView text свойство

Читайте также: