styles - 一个TextView有没有可能同时有多个样式?

  显示原文与译文双语对照的内容

是否可以为TextView内的不同文本设置多种样式?

例如我将文本设置如下:


tv.setText(line1 +"n" + line2 +"n" + word1 +"t" + word2 +"t" + word3);

是否可以为每个文本元素使用不同的样式? 比如,line1粗体,word1斜体等。

执行这些工作的开发人员指南的常见任务,以及如何在安卓包括选择,突出,或者样式设置格式的部分文本:


//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);

但是在文本中使用了明确的位置编号。 有更清晰的方法来做这个?

时间:

在这里,任何人都想知道如何做到这一点,这是一种方法: ( 感谢再次标记) !


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

对于这里方法支持的非正式标记列表,请参考这里链接

尝试 Html.fromHtml(),并用粗体和斜体标记 e.g 标记你的文本:


Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);

稍微 off-topic,但我发现这是非常有用的,不在这里提及。

如果我们想从Html文本中读取 string.xml 资源,从而使本地化变得容易。 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))); 

我没想到这会工作。 但它确实。

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

如果你不喜欢使用 html,你可以创建一个 styles.xml 并使用它:


TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(text, TextView.BufferType.SPANNABLE);

我遇到了同样的问题。 我可以使用 fromHtml,但我现在是安卓,而不是站点,所以我决定试试这个。 我确实需要本地化,所以我使用了字符串替换概念。 我将TextView上的样式设置为主样式,然后只格式化其他 peices 。

我希望这有助于别人做同样的事情- 我不知道为什么这在框架中不容易。

我的字符串如下所示:



<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>

以下是样式:



<style name="MainStyle">
 <item name="android:textSize">@dimen/regular_text</item>
 <item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
 <item name="android:textSize">@dimen/paragraph_bullet</item>
 <item name="android:textColor">@color/standout_text</item>
 <item name="android:textStyle">bold</item>
</style>
<style name="style1">
 <item name="android:textColor">@color/standout_light_text</item>
 <item name="android:textStyle">italic</item>
</style>

下面是调用我的formatStyles方法的代码:



SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

格式方法:



private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
 String tag0 ="{0}";
 int startLocation0 = value.indexOf(tag0);
 value = value.replace(tag0, sub0);

 String tag1 ="{1}";
 int startLocation1 = value.indexOf(tag1);
 if (sub1!= null &&!sub1.equals(""))
 {
 value = value.replace(tag1, sub1);
 }

 SpannableString styledText = new SpannableString(value);
 styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 if (sub1!= null &&!sub1.equals(""))
 {
 styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 }

 return styledText;
}

如果你想在xml中添加样式化文本,你可以创建一个扩展TextView并覆盖 setText()的自定义视图:


public class HTMLStyledTextView extends TextView
{
 public HTMLStyledTextView(Context context) {
 super(context);
 }

 public HTMLStyledTextView(Context context, AttributeSet attrs) {
 super(context, attrs);
 }

 public HTMLStyledTextView(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 }

 @Override
 public void setText(CharSequence text, BufferType type)
 {
 super.setText(Html.fromHtml(text.toString()), type);
 }
}

然后,你可以像这样使用( 用你的软件包名称替换 PACKAGE_NAME ):


<PACKAGE_NAME.HTMLStyledTextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="<![CDATA[
 <b>Bolded Text:</b> Non-Bolded Text
 ]]>"
/>


now <b> element deprecated <strong> renders as <b>, and <em> renders as <i>.
tv.setText(Html.fromHtml("<strong>bold</strong> and <em>italic</em>"));

这对我来说很好

...