46

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

在此处输入图像描述

两个字符 (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?

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

4

4 回答 4

118

如果您仍在寻找答案,我可能有一个解决方案。我有类似的问题。我曾经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));
于 2012-03-23T15:32:39.787 回答
14

您不需要 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);
于 2015-06-29T15:27:36.613 回答
3

您可以使用 SpannableString 数组。

就像在这种情况下:

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

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

lblDescription.setText(TextUtils.concat(finalString));
于 2017-09-05T12:32:58.640 回答
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);
}
于 2016-04-28T09:51:46.683 回答