android– 合并spannable对象时出错

android– 合并spannable对象时出错,第1张

概述我想合并3个spannable对象.这段代码工作正常:Spannables1=newSpannableStringBuilder("bold");s1.setSpan(newStyleSpan(android.graphics.Typeface.BOLD),0,s1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);Spannables2=newSpannable

我想合并3个spannable对象.这段代码工作正常:

Spannable s1 = new SpannableStringBuilder("bold");             s1.setSpan(new StyleSpan(androID.graphics.Typeface.BolD), 0, s1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);             Spannable s2 = new SpannableStringBuilder("not");             Spannable s3 = new SpannableStringBuilder("BolD");             s3.setSpan(new StyleSpan(androID.graphics.Typeface.BolD), 0, s3.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);             finishSpan = (Spanned) TextUtils.concat(s1,s2);             finishSpan = (Spanned) TextUtils.concat(finishSpan,s3);

////////////////////////////////////////////////// ////

或finishSpan =(Spanned)TextUtils.concat(s1,s2,s3);

我有相同的代码但是当我合并3个对象时,结果是错误的.
我已经检查过某些元素的类型是否正确.
beginningOfModifIEdSpannable为粗体,selectionSpannable为normal,endOfModifIEdSpannable为粗体
但他们的合并是错误的.只有结果字符串的最后一部分是粗体.为什么会这样?我上面有相同的代码,效果很好!

  Spannable str = contentText.getText();            Spannable selectionSpannable = new SpannableStringBuilder(str, selectionStart, selectionEnd);            StyleSpan[] ss = selectionSpannable.getSpans(0, selectionSpannable.length(), StyleSpan.class);            boolean exists = false;            for (int i = 0; i < ss.length; i++) {                if (ss[i].getStyle() == androID.graphics.Typeface.BolD){                 selectionSpannable.removeSpan(ss[i]);                    exists = true;                }            }            if (!exists){                str.setSpan(new StyleSpan(androID.graphics.Typeface.BolD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);            }            else {             Spannable endOfModifIEdSpannable = new SpannableStringBuilder(str, selectionEnd, contentText.getText().length());             Spannable beginningOfModifIEdSpannable = new SpannableStringBuilder(str, 0, selectionStart);             Spanned finishSpan = null;             if(beginningOfModifIEdSpannable.length() > 0) {              if(endOfModifIEdSpannable.length() > 0) {               finishSpan = (Spanned) TextUtils.concat(beginningOfModifIEdSpannable,selectionSpannable);               finishSpan = (Spanned) TextUtils.concat(finishSpan,endOfModifIEdSpannable);                 }              else {               finishSpan = (Spanned) TextUtils.concat(beginningOfModifIEdSpannable,selectionSpannable);              }             }             else {              if(endOfModifIEdSpannable.length() > 0) {               finishSpan = (Spanned) TextUtils.concat(selectionSpannable,endOfModifIEdSpannable);                     }                  else {                   finishSpan = selectionSpannable;                  }                 }contentText.setText(finishSpan);

我再说一遍,我已经检查过3个部分是真的.例如.我有3个部分:
你好,世界

我注意到第一次合并是对的:

finishSpan = (Spanned) TextUtils.concat(beginningOfModifIEdSpannable,selectionSpannable);

看起来像Hello,wor

但第二个是错的

finishSpan = (Spanned) TextUtils.concat(finishSpan,endOfModifIEdSpannable);

或者这种合并是错误的:

finishSpan = (Spanned) TextUtils.concat(finishSpan,selectionSpannable,endOfModifIEdSpannable);

错误字符串的结果是:
你好,世界

但真正的结果必须是这样的:

你好,世界

废话!

解决方法:

问题是你很可能对两个部分使用相同的CharacterStyle实例,第一个和第三个.每次向Spannable对象添加样式时,都需要使用新实例.

例如

    SpannableStringBuilder ssb = new SpannableStringBuilder("Hello,world");    CharacterStyle c = new StyleSpan(Typeface.BolD);    ssb.setSpan(c, 0, 3, 0);    ssb.setSpan(c, 9, 11, 0);

这将导致Hello,World

要获得正确的结果,您必须执行以下 *** 作:

    SpannableStringBuilder ssb = new SpannableStringBuilder("Hello,world");    CharacterStyle c = new StyleSpan(Typeface.BolD);    CharacterStyle c2 = new StyleSpan(Typeface.BolD);    ssb.setSpan(c, 0, 3, 0);    ssb.setSpan(c2, 9, 11, 0);
总结

以上是内存溢出为你收集整理的android – 合并spannable对象时出错全部内容,希望文章能够帮你解决android – 合并spannable对象时出错所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1120095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存