最近现在项目中遇到了一个需求 ,就是部分文字可以点击和改变颜色 ,这其实还是ok的 不是什么变态需求 因为也没有做过 我感觉textview 自己就会有实现此需求的办法 一百度还真有
废话不多说 开始上代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tvContent);
final SpannableStringBuilder style = new SpannableStringBuilder();
//设置文字
style.append("如果你真的喜欢我,请疯狂的点击我把");
//设置部分文字点击事件
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "触发点击事件!", Toast.LENGTH_SHORT).show();
}
};
style.setSpan(clickableSpan, 10, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(style);
//设置部分文字颜色
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0000FF"));
style.setSpan(foregroundColorSpan, 10, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//配置给TextView
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(style);
}
}
但是这样写的话确实很快实现了该效果
但是复用性不是很高 而且我现在不知道后台返给我的具体的String是什么 只知道点击的是确定的 所以我有进一步的优化了这个方法
/**
*
* @author 大圣
* @time 2018/10/17 下午3:51
* @param content 全部的文本
* @param str 点击文本
* @param len 点击文本的长度
* @param textView 组件textview
* @param mListeners 接口回调
* @param type 分辨是哪个
*/
private void callService(String content, String str,int len , TextView textView ,final MyDialogListener mListeners ,final int type) {
SpannableStringBuilder builder =new SpannableStringBuilder(content);
int i = content.indexOf(str);//截取文字开始的下标
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//点击后的操作
if (type ==1) {
mListeners.onClicktoH5();
}
if (type ==2) {
mListeners.onClicktoMy();
}
// CommonUtils.call(mContext, "12351");
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.parseColor("#0000FF"));//设置文字颜色
ds.setUnderlineText(true);//设置下划线//根据需要添加
}
}, i, i + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(builder);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
嘻嘻 这个方法是我自己优化过后的 具体的传参注释也有 菜鸟亦可以明白其中的逻辑 也可以根据自己的需求来改 嘻嘻 都半年多没有写博客了 我又开始强势的回归了