安卓设置部分文字的点击事件

引言:
能用一个TextView解决的事情为什么要用两个呢。
方法:
1.两个TextView,甚至多个,可以实现…
2.正解来了,使用SpannableString或SpannableStringBuilder,这两个类专门用于字体样式设置,可以更改颜色,设置点击事件等。
用法:

        SpannableString spannableString=new SpannableString("This is a partly click text");
        spannableString.setSpan(new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                Toast.makeText(Main2Activity.this, "Yes!!!", Toast.LENGTH_SHORT).show();
            }

            /**
             * 重写此函数是为了去除默认的下划线,以及设置我们自己的颜色
             * @param ds 用于自定义样式的画笔对象
             */
            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(Color.YELLOW);
                ds.setUnderlineText(false);
            }
        },17,spannableString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        mPartClick.setText(spannableString);
        mPartClick.setMovementMethod(LinkMovementMethod.getInstance());
        //注意,设置了ClickableSpan后,点击将会触发TextView在该区域的高亮效果,即一个背景变化,我们手动去除
        mPartClick.setHighlightColor(getResources().getColor(android.R.color.transparent));

解释:
1.核心setSpan函数接收四个参数,一个Object(这个参数很厉害,可以传入各种像 xxxSpan名称类的对象,用于设置点击事件或字体颜色等),一个start参数(从哪个文字开始),一个end参数(从哪个文字结束),一个flag参数。
这里说一下flag参数,一般设置为:

/**
     * Non-0-length spans of type SPAN_INCLUSIVE_EXCLUSIVE expand
     * to include text inserted at their starting point but not at their
     * ending point.  When 0-length, they behave like marks.
     */
    public static final int SPAN_INCLUSIVE_EXCLUSIVE = SPAN_MARK_MARK;

    /**
     * Spans of type SPAN_INCLUSIVE_INCLUSIVE expand
     * to include text inserted at either their starting or ending point.
     */
    public static final int SPAN_INCLUSIVE_INCLUSIVE = SPAN_MARK_POINT;

    /**
     * Spans of type SPAN_EXCLUSIVE_EXCLUSIVE do not expand
     * to include text inserted at either their starting or ending point.
     * They can never have a length of 0 and are automatically removed
     * from the buffer if all the text they cover is removed.
     */
    public static final int SPAN_EXCLUSIVE_EXCLUSIVE = SPAN_POINT_MARK;

    /**
     * Non-0-length spans of type SPAN_EXCLUSIVE_INCLUSIVE expand
     * to include text inserted at their ending point but not at their
     * starting point.  When 0-length, they behave like points.
     */
    public static final int SPAN_EXCLUSIVE_INCLUSIVE = SPAN_POINT_POINT;

这四个常量,分别代表了
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE - 不包含两端start和end所在的端点
Spanned.SPAN_EXCLUSIVE_INCLUSIVE - 不包含端start,但包含end所在的端点
Spanned.SPAN_INCLUSIVE_EXCLUSIVE - 包含两端start,但不包含end所在的端点
Spanned.SPAN_INCLUSIVE_INCLUSIVE - 包含两端start和end所在的端点
实际上我操作起来,发现并没有什么区别好像。。。
2.若为TextView设置了点击事件,我们部分点击将会失效。
3.设置了部分点击,还需setMovementMethod之后,才能生效,即响应点击事件,原因暂不明确。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tran_sient

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值