项目中用到了,给一段文字中的几个字添加下滑线,并且给这几个字设置点击监听。
不多说了,直接上代码。
第一步、布局文件,就是普通的 TextView 控件。
第二步、 新增工具类 TextViewSpannableUtils.java
具体代码 :
public class TextViewSpannableUtils {
private static ClickableSpanCallBack mClickableSpanCallBack;
public TextViewSpannableUtils() {
}
/****
* 1. 给部分文字加超链接功能,
* 2. 给部分文字添加下滑线, 点击功能
* 3. 设置文字高亮
* 4. 给部分文字设置背景色
* @param content:整段文字内容, keyWord :需要添加下滑线的文字, resColorID:
要设置添加下滑线文字的颜色resColorID , textView: 布局控件
*/
public static void setSpannable(String content,String keyWord , int resColorID, TextView textView) {
// SpannableStringBuilder builder = new SpannableStringBuilder(content);
// int start = content.indexOf("免责声明");//截取文字开始的下标
int start = content.indexOf(keyWord);//截取文字开始的下标
int totalLength = content.length();
LogUtils.e("setSpannable ------------- start: " + start);
LogUtils.e("setSpannable ------------- totalLength: " + totalLength);
if (start<0){
if (StringUtils.isNotBlank(content)){
textView.setText(content);
}else {
textView.setText("");
}
return;
}
//创建一个 SpannableString对象
// SpannableString sp = new SpannableString("这句话中有百度超链接,有高亮显示,这样,或者这样,还有斜体.");
SpannableString sp = new SpannableString(content);
// 关键字点击事件
sp.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//点击后的操作
LogUtils.e("setSpannable 点击后的操作 -------------");
if (mClickableSpanCallBack != null){
mClickableSpanCallBack.onClick();
}
}
}, start, totalLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置超链接
// sp.setSpan(new URLSpan("http://www.baidu.com"), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置高亮样式一
// sp.setSpan(new BackgroundColorSpan(Color.RED), 17 ,19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体背景高亮样式二
// sp.setSpan(new ForegroundColorSpan(Color.YELLOW),20,24,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置下滑线
sp.setSpan(new StyleSpan( Paint.UNDERLINE_TEXT_FLAG),start ,totalLength,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置字体高亮样式二
// sp.setSpan(new ForegroundColorSpan(MyApplication.getContext().getResources().getColor(R.color.color_333333) ),
// sp.setSpan(new ForegroundColorSpan(Color.BLACK ), start,totalLength,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置字体前景色 Color.MAGENTA 洋红色
// sp.setSpan(new ForegroundColorSpan(Color.BLACK), start, totalLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置斜体
// sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 27, 29, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置字体前景色 Color.MAGENTA 洋红色 color_1A66D0 R.color.color_2982FF
sp.setSpan(new ForegroundColorSpan( resColorID), start, totalLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// sp.setSpan(new ForegroundColorSpan(Color.BLACK), start, totalLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// sp.setSpan(new ForegroundColorSpan(MyApplication.getContext().getResources().getColor(R.color.color_1A66D0)),
// start, totalLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//SpannableString对象设置给TextView
textView.setText(sp);
//设置TextView可点击
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
public static void setPartUnlineOnClick(TextView textView){
textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
textView.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线(删除线)
textView.getPaint().setAntiAlias(true);// 抗锯齿
}
/**
*
* @param content 文字内容
* @param textView 加载文字的textview
*/
public static void callService(String content, TextView textView) {
SpannableStringBuilder builder = new SpannableStringBuilder(content);
int i = content.indexOf("免责");//截取文字开始的下标
int totalLength = content.length();
LogUtils.e("callService ------------- i: " + i);
LogUtils.e("callService ------------- totalLength: " + totalLength);
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//点击后的操作
LogUtils.e("callService 点击后的操作 -------------");
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
}
}, i, totalLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
if (textView != null){
textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG ); //下划线
textView.getPaint().setAntiAlias(true);//抗锯齿
}
textView.setText(builder);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
public void setClickableSpanCallBack(ClickableSpanCallBack clickableSpanCallBack) {
this.mClickableSpanCallBack = clickableSpanCallBack;
}
public interface ClickableSpanCallBack{
void onClick();
}
}
第三步、代码调用。
private void initView(){
mDisclaimerTV = mActivity.findViewById(R.id.self_diagnosis_result_disclaimer_TV); // 免责声明按钮
TextViewSpannableUtils spannableUtils = new TextViewSpannableUtils();
spannableUtils.setClickableSpanCallBack(mClickableSpanCallBack);
// spannableUtils.setSpannable("1.通过医学知识库人体各系统综合诊断,您的伴有症状与之匹配越多,排列越靠前,患有该疾病的可能性越大。\n" +
// "2.自诊结果仅供参考,详情请咨询医生,若病情反复或加重,请及时就医! 免责声明" , "免责声明" , mDisclaimerTV);
spannableUtils.setSpannable(mActivity.getString(R.string.self_diagnosis_result_Disclaimer_text)
+ mActivity.getString(R.string.self_diagnosis_result_Disclaimer_text_keyword) ,
mActivity.getString(R.string.self_diagnosis_result_Disclaimer_text_keyword) ,
mActivity.getResources().getColor(R.color.color_2982FF),
mDisclaimerTV);
}
private TextViewSpannableUtils.ClickableSpanCallBack mClickableSpanCallBack = new TextViewSpannableUtils.ClickableSpanCallBack() { @Override public void onClick() { LogUtils.e("免责声明 点击后的操作 -------------"); // new StartActivityUtils(DisclaimerWebViewActivity.class); // 免责声明 页面 } };
第四步、运行一下吧,看看效果。
很简单的步骤,全部封装好,直接用。