【问题标题】: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() 调用。

【问题讨论】:

    标签: android spannablestring spannable


    【解决方案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() 的起点/终点会有所不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        相关资源
        最近更新 更多