SpannableString文字操作

本文介绍如何使用SpannableString对TextView中的文本进行精细化控制,包括设置超链接、改变文字颜色、添加背景色、设置斜体及下划线等效果,并演示如何通过点击事件实现页面跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TextView是用来显示文本的,有时需要给TextView中的个别字设置为超链接,或者设置个别字的颜色、字体等,那就需要用到Spannable对象,可以借助Spannable对象实现以上设置

总的来说,这个就是一个用来操作textview文本的,不仅可以按照自己的需求设置各种颜色,下划线,背景色等,也可以设置超链接(链接到网页,比如百度:http://www.baidu.com),也可以用来自己的Activity跳转

/**
* 关键方法:
public void setSpan (Object what, int start, int end, int flags)
主要是startend
start是起始位置,无论中英文,都算一个。从0开始计算起。end是结束位置,所以处理的文字,包含开始位置,但不包含结束位置。
*/
SpannableString sp = new SpannableString("这句话中有百度超链接,有高亮显示,这样,或者这样,还有斜体.");
//设置超链接,数字是从第几个开始,在第几个前面结束,下标从零开始,算上标点符号
sp.setSpan(new URLSpan("http://www.baidu.com"),5,7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置高亮样式一,数字是从第几个开始,在第几个前面结束,下标从零开始,算上标点符号
sp.setSpan(new BackgroundColorSpan(Color.RED),17,19,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置高亮样式2,数字是从第几个开始,在第几个前面结束,下标从零开始,算上标点符号
sp.setSpan(new ForegroundColorSpan(Color.YELLOW),20,24,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
//设置斜体,数字是从第几个开始,在第几个前面结束,下标从零开始,算上标点符号
sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 27, 29, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
sp.setSpan(new UnderlineSpan(), 15, 18,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //下划线
//spannableString对象设置给textview
mText.setText(sp);
//设置TextView可点击
mText.setMovementMethod(LinkMovementMethod.getInstance());
mText是自己在布局中布置的TextView,找到id,效果如下:
但是注意:如果上面 SpannableString自己设置了内容,那么布局中的text会被覆盖

然后,我们可以让text设置点击跳转,也可以加上上面的改变。
//自定义textlinearlayout布局,但是会覆盖原有的布局
// layout = new LinearLayout(this);
//直接定义一个textview,但是会掩盖布局中的内容(大概)
// mClickableText = new TextView(this);
// mClickableText.setClickable(true);
// mClickableText.setTextSize(20);
//layout.addView(mText2);
// setContentView(layout);
上面是没有的时候自己定义text,有的话当然是用自己的了
//使用自己本来布局中的text
mText2.setText(getClickableSpan());
mText2.setMovementMethod(LinkMovementMethod.getInstance());
然后就是操作了
private SpannableString getClickableSpan() {
View.OnClickListener l = new View.OnClickListener() {
//如下定义自己的动作
public void onClick(View v) {
这里写的就是跳转的操作了
Toast.makeText(MainActivity.this, "跳转", Toast.LENGTH_SHORT).show();
//在这里就可以做跳转到activity或者弹出对话框的操作了
Intent intent=new Intent(MainActivity.this,MyActivity.class);
startActivity(intent);
}
};

/**
* 后面的参数是字符串,里面可以自己定义内容,配合自定义的布局和textview,也可以用自己已有的
* SpannableString spanableInfo = new SpannableString(mText2.getText().toString());
* SpannableString spanableInfo = new SpannableString("自己随意写点什么都行");
*/
SpannableString spanableInfo = new SpannableString(mText2.getText().toString());
//设置高亮样式一,数字是从第几个开始,在第几个前面结束,下标从零开始,算上标点符号
spanableInfo.setSpan(new BackgroundColorSpan(Color.BLUE),2,7,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置高亮样式一,数字是从第几个开始,在第几个前面结束,下标从零开始,算上标点符号
spanableInfo.setSpan(new BackgroundColorSpan(Color.RED),8,11,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//从第几个往后所有的text都会被点击事件
int start = 16;
int end = spanableInfo.length();
spanableInfo.setSpan(new Clickable(l), start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanableInfo;
}
}
这个可以写成内部类,也可以当做适配器类来写,主要是执行点击事件
class Clickable extends ClickableSpan implements View.OnClickListener {
private final View.OnClickListener mListener;
public Clickable(View.OnClickListener l) {
mListener = l;
}
@Override
public void onClick(View v) {
mListener.onClick(v);
}
下面是结果:这是随意组合的,别纠结好不好看的问题




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值