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)
恕我直言,这是几个数量级更好的工作:-)
caw*_*caw 124
由于这里的最佳答案是暗示出错(或者至少过于复杂),我觉得应该更新,尽管问题已经很久了:
在Android中使用String资源时,您只需getString(...)从Java代码调用或android:text="@string/..."在布局XML中使用.
即使您想在字符串中使用HTML标记,也不必进行大量更改:
您需要在String资源中转义的唯一字符是:
"变成\"'变成\'&变为&或&这意味着您可以添加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(...).
请参阅以下图表以进行比较:

eka*_*was 15
转义HTML标记...
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
Ste*_*gin 10
Android没有指定资源字符串类型的规范(例如text/plain或text/html).但是,有一种解决方法可以让开发人员在XML文件中指定它.
一旦定义了这些,就可以用xml文件中的HTML表达自己,而无需再次调用setText(Html.fromHtml(...)).我很惊讶这种方法不是API的一部分.
此解决方案适用于Android工作室模拟器将文本显示为呈现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)
声明自定义属性命名空间,并添加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)
<resources>
<declare-styleable name="TextViewEx">
<attr name="isHtml" format="boolean"/>
<attr name="android:text" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
198006 次 |
| 最近记录: |