Можно ли установить несколько стилей для разных частей текста внутри TextView?
Например, я устанавливаю текст следующим образом:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
Можно ли иметь разные стили для каждого элемента текста? Например, жирная строка1, курсивное слово1 и т. Д.
Общие задачи руководства разработчика и инструкции по их выполнению в Android включают выделение, выделение или стилизацию частей текста :
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Но это использует явные номера позиций внутри текста. Есть ли более чистый способ сделать это?
Ответы:
В случае, если кому-то интересно, как это сделать, вот один из способов: (Спасибо Марку еще раз!)
Неофициальный список тегов, поддерживаемых этим методом, см. По этой ссылке или по этому вопросу: Какие теги HTML поддерживаются в Android TextView?
источник
formatTextWhite(string text)
что просто вставляет текст в следующую строку формата:"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
? Я помню, это сработало некоторое время назад для меня. Не уверен, что это все еще работает.Html.fromHtml("<font color=\"#999999\">
для меня :) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
спасибоПопробуйте
Html.fromHtml()
и разметьте свой текст HTML-тэгами, выделенными жирным шрифтом и курсивом, например:источник
monthText + " " + month.getYearLabel()
. СмStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
если вам не нужны отдельные части.Немного не по теме, но я нашел это слишком полезным, чтобы не упоминать здесь.
Что если мы хотим прочитать текст Html из ресурса string.xml и, таким образом, облегчить его локализацию. CDATA делают это возможным:
Из нашего Java-кода мы теперь можем использовать его следующим образом:
Я не ожидал, что это сработает. Но это так.
Надеюсь, что это полезно для некоторых из вас!
источник
"@string/someText"
(где «someText» - это ресурс, определенный в strings.xml), я просто получаю строку со всеми тегами HTML как «текст».Если вы не хотите использовать html, вы можете просто создать файл styles.xml и использовать его так:
источник
$1%s is a happy $2%s
в струнных пучках. Вы должны позволить переставить токены.Гораздо проще использовать
SpannableString
вместо разметки html. Это помогает мне видеть наглядные примеры, так что вот дополнительный ответ.Это сингл
TextView
.Дальнейшее изучение
Этот пример был первоначально вдохновлен отсюда .
источник
Список поддерживаемых тегов:
(С http://developer.android.com/guide/faq/commontasks.html#selectingtext - ссылка на веб-архив,
<resource>
опечатка в оригинале!)Это также показывает, что на
Html.fromHtml
самом деле не нужно в простых случаях.источник
Я столкнулся с той же проблемой. Я мог бы использовать fromHtml, но теперь я android, а не web, поэтому я решил попробовать это. Я должен локализовать это, хотя, поэтому я дал ему шанс, используя концепцию замены строки. Я установил стиль в TextView как основной стиль, а затем просто отформатировал другие фрагменты.
Я надеюсь, что это помогает другим, желающим сделать то же самое - я не знаю, почему это не так просто в рамках.
Мои строки выглядят так:
Вот стили:
Вот мой код, который вызывает мой метод formatStyles:
Метод форматирования:
источник
Теперь
<b>
элемент устарел.<strong>
отображает как<b>
и<em>
отображает как<i>
.это прекрасно работает для меня
источник
Вот простой способ сделать это с помощью HTMLBuilder
Результат:
Некоторые Жирный Некоторые курсивный текст
источник
Если вы хотите иметь возможность добавлять стилизованный текст в xml, вы можете создать собственное представление, расширяющее TextView и переопределяющее setText ():
Затем вы можете использовать его следующим образом (замените его
PACKAGE_NAME
именем пакета):источник
Как указано, использовать
TextView.setText(Html.fromHtml(String))
И используйте эти теги в вашей строке в формате HTML:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
источник
Я тоже
Как насчет использования красивой разметки с Котлиным и Анко -
источник
Да, это возможно с помощью
SpannedString
. Если вы используете Kotlin, это становится еще проще с помощьюcore-ktx
, поскольку он предоставляет домен-специфический язык (DSL) для этого:Больше возможностей, предоставляемых этим:
Наконец, вы можете просто:
источник
Фактически, кроме объекта Html, вы также можете использовать классы типов Spannable, например TextAppearanceSpan или TypefaceSpan и SpannableString, чтобы объединить их. Класс HTML также использует эти механизмы. Но с классами Spannable вы получаете больше свободы.
источник
Это может быть так же просто, как использование метода length () строки:
Разбейте текстовую строку в XML-файле Strings на столько подстрок (отдельных строк с точки зрения Android), сколько вам нужно разных стилей, поэтому это может выглядеть так: str1, str2, str3 (как в вашем случае), которые при объединении представляют собой целую строку, которую вы используете.
А затем просто следуйте методу «Span», так же, как вы представили свой код - но вместо одной строки объедините все подстроки, объединяя их в одну, каждая со своим собственным стилем.
Вы по-прежнему используете числа, но не напрямую - они больше не принимают жестко заданную форму (как в вашем коде) сейчас, но они заменяются комбинированными методами length () (обратите внимание на две звезды перед суффиксом и суффиксом над ним). length () вместо абсолютного числа, чтобы погасить изменение):
для первого размера строки, затем str.length () + 1, str.length () + str2.length () для второго размера строки и т. д. со всеми подстроками вместо, например, 0,7 или 8,19 и так далее...
источник
Использование вспомогательного класса Spannable в качестве ресурсов Android String в нижней части веб-страницы. Вы можете подойти к этому, создав
CharSquences
и придав им стиль.Но в приведенном нами примере они выделены жирным шрифтом, курсивом и даже раскрашивают текст. Мне нужно было обернуть несколько стилей
CharSequence
в, чтобы установить их вTextView
. Так что к этому классу (я назвал егоCharSequenceStyles
) я просто добавил эту функцию.И в представлении я добавил это.
Я надеюсь, что это поможет вам!
источник
Spanny делает SpannableString проще в использовании.
источник
Как сказал Джон , для меня это лучшее решение, и вам не нужно устанавливать какой-либо текст во время выполнения, используйте только этот пользовательский класс HtmlTextView
и вот, теперь только поместите это в свой XML
с вашей строкой HTML
источник