我想合并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对象时出错所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)