android TextView 给部分文字添加下滑线, 点击功能

项目中用到了,给一段文字中的几个字添加下滑线,并且给这几个字设置点击监听。

不多说了,直接上代码。

 

第一步、布局文件,就是普通的 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);   // 免责声明 页面
    }
};

第四步、运行一下吧,看看效果。

很简单的步骤,全部封装好,直接用。

android TextView 给部分文字添加下滑线, 点击功能_第1张图片关注公众号,了解更多精选文章吧。

 

 

 

你可能感兴趣的:(android开发)