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

Posted

技术标签:

【中文标题】SpannableString:是不是可以应用两个或多个RelativeSizeSpans?【英文标题】:SpannableString: Is it possible to apply two or more RelativeSizeSpans?SpannableString:是否可以应用两个或多个RelativeSizeSpans? 【发布时间】:2011-12-12 16:48:11 【问题描述】:

我正在尝试构造一个 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。这是真实的还是预期的行为? 改为连接 TextView 是否可取?

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

【问题讨论】:

【参考方案1】:

如果您仍在寻找答案,我可能有一个解决方案。我有类似的问题。我用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));

【讨论】:

另请注意,如果没有textView.movementMethod = LinkMovementMethod.getInstance()ClickableSpan 将无法工作【参考方案2】:

您不需要 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);

【讨论】:

【参考方案3】:

您可以使用 SpannableString 数组。

就像在这种情况下:

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

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

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

【讨论】:

【参考方案4】:

我在我的项目中使用了 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);

【讨论】:

这有时会出错。您的小时可能会给出前导 0 或分钟可以是两位数或一位数。在这种情况下,您 setSpan() 的起点/终点会有所不同。

以上是关于SpannableString:是不是可以应用两个或多个RelativeSizeSpans?的主要内容,如果未能解决你的问题,请参考以下文章

Android SpannableString浅析

Android 中使用SpannableString实现TextView文本超链接跳转功能

Android 中使用SpannableString实现TextView文本超链接跳转功能

SpannableString 可以序列化吗?

Android开发之SpannableString具体解释

使用SpannableString实现一个load小动画