是否有可能为一个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标记的粗体或斜体。目前支持的标签有:B(粗体)、I(斜体)、U(下划线)、TT(单行)、BIG、SMALL、SUP(上标)、SUB(下标)和STRIKE(划线)。例如,在res/values/strings.xml中,你可以这样声明: <资源> <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string> > < /资源

(来自http://developer.android.com/guide/faq/commontasks.html#selectingtext - Web Archive链接,<资源>错别字是在原始!)

它还表明在简单的情况下并不真正需要Html.fromHtml。

其他回答

支持的标签列表如下:

如果使用字符串资源,则可以添加一些简单的样式,例如使用HTML标记的粗体或斜体。目前支持的标签有:B(粗体)、I(斜体)、U(下划线)、TT(单行)、BIG、SMALL、SUP(上标)、SUB(下标)和STRIKE(划线)。例如,在res/values/strings.xml中,你可以这样声明: <资源> <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string> > < /资源

(来自http://developer.android.com/guide/faq/commontasks.html#selectingtext - Web Archive链接,<资源>错别字是在原始!)

它还表明在简单的情况下并不真正需要Html.fromHtml。

我也是

如何使用一些漂亮的标记与Kotlin和Anko -

import org.jetbrains.anko.*
override fun onCreate(savedInstanceState: Bundle?) {
    title = "Created with Beautiful Markup"
    super.onCreate(savedInstanceState)

    verticalLayout {
        editText {
            hint = buildSpanned {
                append("Italic, ", Italic)
                append("highlighted", backgroundColor(0xFFFFFF00.toInt()))
                append(", Bold", Bold)
            }
        }
    }
}

在网页底部使用一个辅助的可扩展类作为Android字符串资源共享。你可以通过创建charsquences并给它们一个样式来实现。

但在他们给我们的例子中,只是粗体,斜体,甚至是彩色文本。我需要在aCharSequence中包装几个样式,以便在TextView中设置它们。所以这个类(我命名为charsequencestyle),我只是添加了这个函数。

public static CharSequence applyGroup(LinkedList<CharSequence> content){
    SpannableStringBuilder text = new SpannableStringBuilder();
    for (CharSequence item : content) {
        text.append(item);
    }
    return text;
}

在视图中我添加了这个。

            message.push(postMessageText);
            message.push(limitDebtAmount);
            message.push(pretMessageText);
            TextView.setText(CharSequenceStyles.applyGroup(message));

我希望这对你有帮助!

如果有人想知道如何做到这一点,这里有一种方法:(再次感谢马克!)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

关于这个方法支持的非官方标签列表,请参考这个链接或这个问题:Android TextView支持哪些HTML标签?

有点离题,但我觉得这个太有用了,不能不在这里提一下。

如果我们想从string.xml资源中读取Html文本,从而使其易于本地化。CDATA使这成为可能:

<string name="my_text">
  <![CDATA[
    <b>Autor:</b> Mr Nice Guy<br/>
    <b>Contact:</b> myemail@grail.com<br/>
    <i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
  ]]>
</string> 

从我们的Java代码中,我们现在可以像这样使用它:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

我没想到这有用。但事实确实如此。

希望它对你们中的一些人有用!