Android Textview 动态 部分文字点击 改变颜色

最近现在项目中遇到了一个需求 ,就是部分文字可以点击和改变颜色 ,这其实还是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());

    }

嘻嘻 这个方法是我自己优化过后的  具体的传参注释也有   菜鸟亦可以明白其中的逻辑   也可以根据自己的需求来改  嘻嘻 都半年多没有写博客了   我又开始强势的回归了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值