如何在TextView中显示格式化文本?

10

我该如何在TextView中显示格式化文本?

仅仅将格式化文本复制粘贴到字符串资源文件中也不起作用。

<string name="some_text">Some Formatted text copied from browser</string>

Java:

TextView textView = (TextView) findViewById(R.id.some);
textView.setText(getString(R.string.some_text));

但它显示为普通文本。要求是显示彩色或粗体文本等。


请详细说明您想要的内容...我发现您没有写出任何句子来解释这一点!! - Mohamed Nagy Mostafa
我想在我的TextView中显示格式化文本。TextView textView =(TextView)findViewById(R.id.some); textview.setText(getString(R.string.some_text)); 但它显示的所有字体和大小都相同。 <string name =“some_text”> 在Google Play上为Gboard创建贴纸 2017年9月1日 由Gboard的副产品经理Alan Ni发布 消息传递变得越来越有表现力 - 今天,您可以用表情符号,gif或贴纸来表达我爱你。数百万用户每天分享表达性内容</string> ..... 就像这样..我希望它有粗体标题和其他东西。 - Prateek Kumar
1个回答

24

如果您想为文本添加样式,有几种选择。


最简单的方法是使用HTML标签。但是您需要用CDATA将其包装起来。

例如,您可以创建您的字符串:

<string name="some_text"><![CDATA[Create stickers for <b>Gboard</b>...]]></string>

然后要显示它,你可以这样做。

Spanned sp = Html.fromHtml( getString(R.string.some_text));
tv.setText(sp);

更稳健的方法是实际使用 Android 的样式。

您需要创建多个具有自己样式的 TextView,这将允许您对文本的外观进行精确控制。

例如,您可以创建类似以下布局。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- Creating a Title for your layout. -->
    <TextView
        style="@style/TextAppearance.AppCompat.Title" <!-- Title Style -->
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Create stickers for Gboard on Google Play"
         />
    <!-- Creating a subheader for your layout. -->
    <TextView
        style="@style/TextAppearance.AppCompat.Caption" <!-- Caption Style -->
        android:id="@+id/subheader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="01 September 2017"
         />

</LinearLayout>
对于每种不同的格式,您需要创建一个新的TextView并应用正确的样式。
我建议坚持使用@style/TextAppearance.AppCompat...以下的任何内容,因为这将为您的文本大小和粗细提供非常好的起点。
您可以使用TitleCaptionBody2Body1等等。
此后,当您将样式掌握得更熟练时,就可以开始创建自己的样式。
例如,假设我想要所有的标题都是RED。您首先需要在styles.xml中创建一个样式。
<style name="myTitleStyle" parent="TextAppearance.AppCompat.Title">
    <item name="android:textColor">@color/red</item>
</style>

然后您可以像之前的样式一样使用它。

<!-- Creating a Title for your layout. -->
        <TextView
            style="@style/myTitleStyle" <!-- myTitleStyle Style -->
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Create stickers for Gboard on Google Play"
             />

我已经编辑了我的答案,希望这能帮助你找到一个好的解决方案。 - advice
Html.fromHtml() 已经被弃用了。:( 在 N+ 上。 - Tupio
1
@magic_man 根据来源,你应该使用 fromHtml(String source, int flags)。 - Ewan
哇,这个API真是太邪恶了,使用Spanned将HTML文本提供给TextView来显示(因为Spanned是CharSequence的子类)。难怪我在文档中找不到它!:-P 谢谢。(另外,在TextView.setText的文档中写着“不会”?嗯)。 - Robin Davies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接