从XML格式的html格式的字符串资源中设置TextView文本

slu*_*lup 191 html formatting android textview

我的内部有一些固定的字符串strings.xml,例如:

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>
Run Code Online (Sandbox Code Playgroud)

在我的布局中,我有一个TextView我想填充html格式的字符串.

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>
Run Code Online (Sandbox Code Playgroud)

如果我这样做,内容formattedtext只是somestring剥离任何html标签的内容,因此没有格式化.

我知道可以用编程方式设置格式化文本

.setText(Html.fromHtml(somestring));

因为我在我的程序的其他部分使用它,它按预期工作.

要调用这个函数我需要一个Activity,但是目前我的布局只是一个简单的或多或少的静态视图,我希望保持这种方式,以节省我创建一个Activity刚刚设置一些的开销文本.

我忽略了一些明显的东西吗 它根本不可能吗?欢迎任何帮助或变通方法!

编辑:刚试了一些东西,似乎xml中的HTML格式有一些限制:

  • 标签必须写成小写

  • 这里提到的一些标签 不起作用,例如<br/>(可以改为使用\n)

Bit*_*g3r 470

万一有人发现这个,有一个更好的替代品没有记录(我搜索了几个小时后绊倒了它,最后在Android SDK本身的bug列表中找到它).您CAN包括在strings.xml中原始的HTML,只要你把它包装

<![CDATA[ ...raw html... ]]>
Run Code Online (Sandbox Code Playgroud)

例:

<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>
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中:

TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html)));
Run Code Online (Sandbox Code Playgroud)

恕我直言,这是几个数量级更好的工作:-)

  • 只是要添加,你也可以在CDATA块中反斜杠 - 转义撇号/单引号,这样你就可以得到像<b>不能</ b>而不是无限丑陋的东西<b> can's t </b>的 (26认同)
  • 这仍然有用吗?我只是尝试了它,它实际上显示了<p>和</ p>. (5认同)
  • 有没有办法避免"Html.fromHtml"? (2认同)

caw*_*caw 124

由于这里的最佳答案是暗示出错(或者至少过于复杂),我觉得应该更新,尽管问题已经很久了:

在Android中使用String资源时,您只需getString(...)从Java代码调用或android:text="@string/..."在布局XML中使用.

即使您想在字符串中使用HTML标记,也不必进行大量更改:

您需要在String资源中转义的唯一字符是:

  • 双引号:"变成\"
  • 单引号:'变成\'
  • &符号:&变为&#38;&amp;

这意味着您可以添加HTML标记而无需转义标记:

<string name="my_string"><b>Hello World!</b> This is an example.</string>
Run Code Online (Sandbox Code Playgroud)

然而,可以肯定,你应该只使用<b>,<i><u>为它们在文档中列出.

如果你想使用XML中的HTML字符串,继续使用android:text="@string/...",它将正常工作.

唯一的区别是,如果你想使用Java代码中的 HTML字符串,你必须使用getText(...)而不是getString(...)现在,因为前者保留了样式,而后者只是将其剥离.

就这么简单.没有CDATA,没有Html.fromHtml(...).

您只需要Html.fromHtml(...),如果你没有编码的HTML标记的特殊字符.getString(...)然后使用它.如果要将String传递给,则可能需要这样做String.format(...).

这些都在文档中描述.

编辑:

getText(...)与未转义的HTML(如我所提议的)或CDATA部分和之间没有区别Html.fromHtml(...).

请参阅以下图表以进行比较:

在此输入图像描述

  • 为了更好地帮助,我需要查看Java/XML摘录.但正如我写的:你只能确定你是否使用`<b>`,`<i>`,`<u>`.其他标签并不总是受支持. (3认同)

eka*_*was 15

转义HTML标记...

<resources>
    <string name="somestring">
        &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt;
        Content
    </string>
</resources>
Run Code Online (Sandbox Code Playgroud)

  • 我测试了这个,如果你从java源代码中使用它,那很好.但是如果直接从布局XML关联文本,则标签会显示在文本视图中(例如<B>标题</ B> ...) (3认同)
  • 如果您想直接从 XML 使用 HTML 字符串,您可以_不_在字符串中编码 HTML 特殊字符。但是,如果您想通过`Html.fromHTML()` 使用代码中的字符串,您_必须_对特殊字符进行编码。奇怪的! (2认同)

Ste*_*gin 10

Android没有指定资源字符串类型的规范(例如text/plain或text/html).但是,有一种解决方法可以让开发人员在XML文件中指定它.

  1. 定义自定义属性以指定android:text属性为html.
  2. 使用子类TextView.

一旦定义了这些,就可以用xml文件中的HTML表达自己,而无需再次调用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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

res/values/attrs.xml(定义子类的自定义属性)

 <resources>
<declare-styleable name="TextViewEx">
    <attr name="isHtml" format="boolean"/>
    <attr name="android:text" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)


Ran*_*mar 10

最近更新:

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));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

  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);
Run Code Online (Sandbox Code Playgroud)