У меня внутри есть фиксированные строки strings.xml
, например:
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
и в моем макете у меня есть, TextView
который я хотел бы заполнить строкой в формате html.
<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>
если я это сделаю, содержимое formattedtext
будет просто содержимым без somestring
каких-либо тегов html и, следовательно, неформатированным.
Я знаю, что можно программно установить форматированный текст с помощью
.setText(Html.fromHtml(somestring));
потому что я использую это в других частях моей программы, где он работает должным образом.
Для вызова этой функции мне нужен Activity
, но на данный момент мой макет представляет собой простое более или менее статическое представление в простом XML, и я бы предпочел оставить его таким, чтобы избавить меня от накладных расходов на создание Activity
просто для установки некоторых текст.
Я не замечаю чего-то очевидного? Неужели это вообще невозможно? Любая помощь или обходные пути приветствуются!
Изменить: просто попробовал кое-что, и кажется, что форматирование HTML в xml имеет некоторые ограничения:
теги должны быть написаны в нижнем регистре
некоторые теги, упомянутые здесь , не работают, например
<br/>
(\n
вместо них можно использовать )
источник
Ответы:
На случай, если кто-нибудь найдет это, есть более приятная альтернатива, которая не задокументирована (я споткнулся о ней после нескольких часов поиска и, наконец, нашел ее в списке ошибок для самого Android SDK). Вы МОЖЕТЕ включить необработанный HTML в strings.xml, если вы оберните его в
Пример:
<string name="nice_html"> <![CDATA[ <p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p> <p>This is another paragraph of the same string.</p> ]]> </string>
Затем в вашем коде:
TextView foo = (TextView)findViewById(R.id.foo); foo.setText(Html.fromHtml(getString(R.string.nice_html)));
ИМХО, с этим работать на несколько порядков приятнее :-)
источник
Html.fromHtml(getString(R.string.nice_html))
немного поработал ? :)Поскольку главный ответ здесь предполагает что-то неправильное (или, по крайней мере, слишком сложное), я считаю, что это следует обновить, хотя вопрос довольно старый:
При использовании ресурсов String в Android вам просто нужно вызвать
getString(...)
из кода Java или использоватьandroid:text="@string/..."
в макете XML.Даже если вы хотите использовать разметку HTML в своих строках, вам не нужно сильно менять:
Единственные символы, которые вам нужно экранировать в ваших строковых ресурсах:
"
становится\"
'
становится\'
&
становится&
или&
Это означает, что вы можете добавить разметку HTML, не экранируя теги:
<string name="my_string"><b>Hello World!</b> This is an example.</string>
Однако, чтобы быть уверенным, вы должны использовать только
<b>
,<i>
и<u>
как они перечислены в документации.Если вы хотите использовать свои HTML-строки из XML , просто продолжайте использовать
android:text="@string/..."
, он будет работать нормально.Единственное отличие состоит в том, что если вы хотите использовать свои HTML-строки из кода Java , вы должны использовать
getText(...)
вместо негоgetString(...)
now, поскольку первый сохраняет стиль, а второй просто удаляет его.Это так просто. Нет CDATA, нет
Html.fromHtml(...)
.Вам нужно будет только
Html.fromHtml(...)
если вы сделали закодировать свои специальные символы в HTML разметке. Используйте это сgetString(...)
then. Это может быть необходимо, если вы хотите передать String вString.format(...)
.Все это тоже описано в документации .
Редактировать:
Нет никакой разницы между
getText(...)
неэкранированным HTML (как я предлагал) илиCDATA
разделами иHtml.fromHtml(...)
.См. Следующий рисунок для сравнения:
источник
getResources().getText(R.string.codename)
<b>
,<i>
,<u>
. Другие теги не всегда поддерживаются.Избегайте тегов HTML ...
<resources> <string name="somestring"> <B>Title</B><BR/> Content </string> </resources>
источник
TextView
для отображения HTML?fromHTML()
.Html.fromHTML()
вам необходимо закодировать специальные символы. Странный!Android не имеет спецификации для указания типа строки ресурса (например, text / plain или text / html). Однако существует обходной путь, который позволит разработчику указать это в файле XML.
Как только вы их определите, вы сможете выражать себя с помощью HTML в файлах xml без повторного вызова setText (Html.fromHtml (...)). Я очень удивлен, что этот подход не является частью API.
Это решение работает в той степени, в которой симулятор студии Android будет отображать текст как визуализированный HTML.
res / values / strings.xml (строковый ресурс как HTML)
<resources> <string name="app_name">TextViewEx</string> <string name="string_with_html"><![CDATA[ <em>Hello</em> <strong>World</strong>! ]]></string> </resources>
layout.xml (только соответствующие части)
Объявите пространство имен настраиваемого атрибута и добавьте атрибут android_ex: isHtml. Также используйте подкласс TextView.
<RelativeLayout ... xmlns:android_ex="http://schemas.android.com/apk/res-auto" ...> <tv.twelvetone.samples.textviewex.TextViewEx android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/string_with_html" android_ex:isHtml="true" /> </RelativeLayout>
res / values / attrs.xml (определите настраиваемые атрибуты для подкласса)
<resources> <declare-styleable name="TextViewEx"> <attr name="isHtml" format="boolean"/> <attr name="android:text" /> </declare-styleable> </resources>
TextViewEx.java (подкласс TextView)
package tv.twelvetone.samples.textviewex; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.Nullable; import android.text.Html; import android.util.AttributeSet; import android.widget.TextView; public TextViewEx(Context context, @Nullable AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextViewEx, 0, 0); try { boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false); if (isHtml) { String text = a.getString(R.styleable.TextViewEx_android_text); if (text != null) { setText(Html.fromHtml(text)); } } } catch (Exception e) { e.printStackTrace(); } finally { a.recycle(); } } }
источник
Последнее обновление:
Html.fromHtml(string);
// устарело после версий Android N.Следующий код поддерживает версии Android N и выше ...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { textView.setText(Html.fromHtml(yourHtmlString,Html.FROM_HTML_MODE_LEGACY)); } else { textView.setText(Html.fromHtml(yourHtmlString)); }
источник
String termsOfCondition="<font color=#cc0029>Terms of Use </font>"; String commma="<font color=#000000>, </font>"; String privacyPolicy="<font color=#cc0029>Privacy Policy </font>"; Spanned text=Html.fromHtml("I am of legal age and I have read, understood, agreed and accepted the "+termsOfCondition+commma+privacyPolicy); secondCheckBox.setText(text);
источник
У меня есть другой случай, когда у меня нет возможности поместить CDATA в xml, поскольку я получаю строку HTML с сервера.
Вот что я получаю от сервера:
<p>The quick brown <br /> fox jumps <br /> over the lazy dog<br /> </p>
Вроде бы сложнее, но решение намного проще.
private TextView textView; protected void onCreate(Bundle savedInstanceState) { ..... textView = (TextView) findViewById(R.id.text); //need to define in your layout String htmlFromServer = getHTMLContentFromAServer(); textView.setText(Html.fromHtml(htmlFromServer).toString()); }
Надеюсь, это поможет!
Линь
источник