SpannableString:是否可以应用两个或更多RelativeSizeSpans?

时间:2011-10-21 15:35:59

标签: android spannablestring spannable

我正在尝试构造一个SpannableString,使它看起来像这样:

enter image description here

两个字符(m,s)应小于其余字符。 我试图在一个SpannableString中保存所有文本,并且我还尝试通过SpannableStringBuilder连接两个SpannableStrings。 一个Spannable的代码如下所示:

spannable.setSpan(new RelativeSizeSpan(0.75f), spannable.length() - 1, spannable.length(), 0);

但是,只应用了一种格式 - 使用SpannableStringBuilder时,只有“m”更小,而对整个文本使用一个SpannableString时,只有“s”更小。

调试还显示Spannables似乎只包含一个RelativeSizeSpan实例,这意味着一个类型只能有一个Span。这是真实的还是预期的行为? 是否建议连接TextViews?

编辑:顺便说一下,出于性能原因,我试图在此处删除HTML.fromHtml()调用(许多GC调用)。

4 个答案:

答案 0 :(得分:103)

如果您仍在寻找答案,我可能会有一个解决方案。我有类似的问题。我使用TextUtils来连接2 SpannableString

以下是一些示例代码:

SpannableString span1 = new SpannableString("32m");
SpannableString span2 = new SpannableString("50s");

span1.setSpan(new RelativeSizeSpan(0.75f),  2, 3, 0);
span2.setSpan(new RelativeSizeSpan(0.75f),  2, 3, 0);

mTextView.setText(TextUtils.concat(span1," " ,span2));

答案 1 :(得分:13)

您不需要2个单独的SpannableString。 更短的解决方案可以是:

SpannableString span1 = new SpannableString("32m50s");

span1.setSpan(new RelativeSizeSpan(0.75f),  2, 3, 0);
span1.setSpan(new RelativeSizeSpan(0.75f),  5, 6, 0);

mTextView.setText(span1);

答案 2 :(得分:3)

您可以使用SpannableString数组。

就像这种情况一样:

TextView lblDescription=(TextView ) findViewById(R.id.lblDescription);

SpannableString[] finalString = new SpannableString[stringSplit.length];

lblDescription.setText(TextUtils.concat(finalString));

答案 3 :(得分:1)

我在我的项目中使用了动态版本的gbero答案,

public void updateTime(TextView tv) {

    Calendar calendar = Calendar.getInstance();

    SpannableString span = new SpannableString(
            calendar.get(Calendar.HOUR_OF_DAY) + "h" + calendar.get(Calendar.MINUTE) + "m");

    span.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
    span.setSpan(new RelativeSizeSpan(0.75f), 5, 6, 0);

    tv.setText(span);
}