android 不同行字体不同,android中自定义textView自动区分SpannableStringBuilder中的不同样式字体...

..好尴尬,没有人回答..

最后这个我问题,我这样解决的.(我翻看了TextView的源码,可惜看不太懂)

重写了SpannableString,在里面定义了一个tag字段,用来区分这段文字是什么类型.

然后自定义了一个SpannableStringBuilder,里面维护了一个ArrayList,用来区分每一段append进去的文字.

public class MySpannableString extends SpannableString {

private String tag;

public MySpannableString(CharSequence source, String tag) {

super(source);

this.tag = tag;

}

public String getTag() {

return tag;

}

public void setTag(String tag) {

this.tag = tag;

}

}

public class MySpannableStringBuilder {

private static MySpannableStringBuilder mySpannableStringBuilder;

private static ArrayList spannableStringArrayList;

private MySpannableStringBuilder() {

}

public static synchronized MySpannableStringBuilder getMySpannableStringBuilderInstance() {

if (mySpannableStringBuilder == null) {

mySpannableStringBuilder = new MySpannableStringBuilder();

}

return mySpannableStringBuilder;

}

public static synchronized ArrayList getSpannableStringArrayListInstance() {

if (spannableStringArrayList == null) {

spannableStringArrayList = new ArrayList();

}

return spannableStringArrayList;

}

public MySpannableStringBuilder append(MySpannableString text) {

getSpannableStringArrayListInstance().add(text);

return getMySpannableStringBuilderInstance();

}

}

//在Activity中

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

myTextView = new MyTextView(this);

String str1 = "11111111";

MySpannableString spannableString1 = new MySpannableString(str1, "p");

spannableString1.setSpan(new AbsoluteSizeSpan(20, true), 0, str1.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

String str2 = "2222222";

MySpannableString spannableString2 = new MySpannableString(str2, "h1");

spannableString2.setSpan(new AbsoluteSizeSpan(50, true), 0, str2.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

String str3 = "44444444";

MySpannableString spannableString3 = new MySpannableString(str3, "h2");

spannableString3.setSpan(new AbsoluteSizeSpan(50, true), 0, str3.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

String str4 = "555";

MySpannableString spannableString4 = new MySpannableString(str4, "h3");

spannableString4.setSpan(new AbsoluteSizeSpan(50, true), 0, str4.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

String str5 = "666666";

MySpannableString spannableString5 = new MySpannableString(str5, "h4");

spannableString5.setSpan(new AbsoluteSizeSpan(50, true), 0, str5.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

String str6 = "777777";

MySpannableString spannableString6 = new MySpannableString(str6, "p");

spannableString6.setSpan(new AbsoluteSizeSpan(50, true), 0, str6.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

MySpannableStringBuilder ssb = MySpannableStringBuilder.getMySpannableStringBuilderInstance();

MySpannableStringBuilder mySpannableStringBuilder = ssb.append(spannableString1).

append(spannableString1).

append(spannableString1).

append(spannableString1).

append(spannableString1).

append(spannableString2);

myTextView.setText(mySpannableStringBuilder);

setContentView(myTextView);

}

如果有大牛觉得这样写不好,或者是有其他方案,欢迎共同讨论交流.

//----------------------------

又发现了一种方法

String str2 = "2222222";

MySpannableString spannableString2 = new MySpannableString(str2, "h1");

spannableString2.setSpan(new AbsoluteSizeSpan(50, true), 0, str2.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

//直接通过 spannableString2.getSpan();

// 三个参数:起始位置,结束位置,Span类型

AbsoluteSizeSpan[] spans = spannableString2.getSpans(0, spannableString2.length(), AbsoluteSizeSpan.class);

System.out.println(spans[0].getSize());

// 如果无法确定里面到底都是用了什么样式可以通过这种方法获取.

Object[] spans = spannableString.getSpans(0,spannableString.length(), Object.class);

for (Object object : spans) {

if (object instanceof AbsoluteSizeSpan) {

} else if(...){

...

}

}

如果设置了其他的Span,那就通过类似的方法拿出来.

不过如果把多个SpannableString放到SpannableStringBuilder里面去.还是没有办法区分他的起始位置和结束为止,这里就还是需要用到上面自定义的MySpannableStringBuilder来进行存储.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值