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实现TextView文本超链接跳转功能