仿qq空间点赞 文本分段点击响应点击事件

本文介绍如何利用TextView和SpannableStringBuilder的setSpan方法,实现类似QQ空间点赞的文本分段点击响应功能。参考了官方文档,通过设置不同范围的对象实现点击事件。
摘要由CSDN通过智能技术生成



实现效果 :思路主要是使用TextView和SpanableStringBuilder的setSpan方法实现的 

参考文档http://androiddoc.qiniudn.com/reference/android/text/SpannableStringBuilder.html#setSpan(java.lang.Object, int, int, int)

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="themeone.testtablayout.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_width="wrap_content"
        android:id="@+id/tv_recieve"
        android:layout_height="wrap_content"
        android:text=""/>
</RelativeLayout>

主要代码思路

public class MainActivity extends Activity implements View.OnClickListener {

    
    private TextView tv_recieve;

    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_recieve = (TextView) findViewById(R.id.tv_recieve);
        tv_recieve.setOnClickListener(this);

        //仿qq空间点赞text文本分段点击事件
        setTextMultClick();

    }
    //准备数据
    private void setTextMultClick() {
        StringBuilder sb=new StringBuilder();
        for (int i = 0; i < 20; i++) {
            sb.append("好友"+i+",");
        }

        String users=sb.substring(0,sb.lastIndexOf(","));
        tv_recieve.setText(addClickPart(users), TextView.BufferType.SPANNABLE);
    }

    //定义点击每个部分文字的处理方法
    private SpannableStringBuilder addClickPart(String users) {
        ImageSpan imageSpan=new ImageSpan(getApplicationContext(),R.mipmap.ic_launcher);
        SpannableString spanStr=new SpannableString("i.");//任意文字 主要是实现效果
        //Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 前后都不包括
        spanStr.setSpan(imageSpan,0,1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //创建一个ssb 存储总的用户
        SpannableStringBuilder ssb=new SpannableStringBuilder(spanStr);
        ssb.append(users);

        //为每段数据创建点击 事件
        String[] users_array=users.split(",");
        if(users_array.length>0){
            for (int i = 0; i < users_array.length; i++) {
                final String user_name = users_array[i];//好友0
                int start=users.indexOf(user_name)+spanStr.length();

                //为每段数据增加点击事件
                ssb.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
                        Toast.makeText(MainActivity.this,user_name, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void updateDrawState(TextPaint ds) {
                        super.updateDrawState(ds);
                        ds.setColor(Color.BLUE);
//                        ds.setUnderlineText(false);
                    }
                },start,start+user_name.length(),0);
            }
        }

        return ssb.append("等"+users_array.length+"人觉得很赞");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值