简单的Text文本点击工具类

本文介绍了一种文本点击工具类的实现方法,适用于APP隐私政策弹窗中的特定文本点击及文本展示不全时的“更多”点击事件。通过示例展示了如何在Android应用中设置文本点击事件。

二话不说,先上效果。

文本点击事件工具类

1、应用于APP首次安装时弹出的隐私政策弹窗内容的文本点击事件

布局很简单,只有一个TextView,其他代码如下:

	/**
     * 点击文本中的部分文本  如首次安装APP弹出的隐私政策和用户协议,明确标出并支持点击跳转
     *
     * @param context                上下文
     * @param textView               展示的TextView
     * @param string                 TextView要展示的文本内容(含需点击的文本)
     * @param onContentClickListener 文本中需点击的文字监听事件
     * @param tags                   需点击的文本
     */
    public static void setTagClicks(Context context, TextView textView, String string,
                                    OnContentClickListener onContentClickListener, String... tags) {
        SpannableString spannableString = new SpannableString(string);
        if (tags.length > 0) {
            for (String tag : tags) {
                int index = string.indexOf(tag);
                spannableString.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(@NonNull View widget) {
                        if (onContentClickListener != null) {
                            onContentClickListener.onContentClick(tag);
                        }
                    }

                    @Override
                    public void updateDrawState(@NonNull TextPaint ds) {
                        super.updateDrawState(ds);
                        ds.setUnderlineText(false);//去除点击文本的下划线
                    }
                }, index, index + tag.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                //将点击文本设置为红色(#DF2727)
                spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.color_DF2727)),
                        index, index + tag.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        } else {
            Log.e("TextClickUtils", "Exception: Please enter the tag word!");
        }
        textView.setText(spannableString);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    public interface OnContentClickListener {
        void onContentClick(String returnTag);
    }

调用方法如下:

	TextView tvPrivacyPolicy = (TextView) findViewById(R.id.tv_privacy_policy);
	String content0 = "请您务必审慎阅读、充分理解“用户协议”和“隐私政策”的各项条款,包括但不限于:为了向您提供交易相关基本功能,我们会收集、使用必要的信息。\n您可阅读《用户协议》和《隐私政策》了解详细信息。如您同意,请点击“同意”接受我们的服务。";
	String tag0 = "《用户协议》";
	String tag1 = "《隐私政策》";
	TextClickUtils.setTagClicks(SecondActivity.this, tvPrivacyPolicy, content0, returnTag -> {
		if (returnTag.equals(tag0)) {
			Toast.makeText(SecondActivity.this, tag0, Toast.LENGTH_SHORT).show();
		} else if (returnTag.equals(tag1)) {
			Toast.makeText(SecondActivity.this, tag1, Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(SecondActivity.this, "其他", Toast.LENGTH_SHORT).show();
		}
	}, tag0, tag1);

2、应用于文本展示超出无法显示全时,末尾添加“更多”或者“查看详情”等文本并支持点击事件

布局代码只有一个TextView,如下所示:

	<TextView
        android:id="@+id/tv_more"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:ellipsize="end"
        android:lineSpacingExtra="4dp"
        android:maxLines="2"
        android:textColor="#333333"
        android:textSize="16dp" />

逻辑代码如下:

	public static final String ADDED_STRING = "... 更多";

    /**
     * 文本展示超出无法显示全时,末尾添加”更多“或者”查看详情“等文本并支持点击事件  此处以添加“更多”为例
     *
     * @param context                上下文
     * @param textView               展示控件
     * @param string                 展示的内容
     * @param onContentClickListener 末尾文本点击事件回调
     */
    public static void setEndTextClick(Context context, TextView textView, String string, OnContentClickListener onContentClickListener) {
        textView.post(() -> {
            //初始化,用于判断字符串是否全部展示出来。
            textView.setText(string);
            Layout layout = textView.getLayout();
            int lineCount = layout.getLineCount();
            //在这里要特别的注意string里面如果有换行符,则获取到的getEllipsisCount不准。
            int ellipsisCount = layout.getEllipsisCount(lineCount - 1);
            //大于0表示被省略了,0表示全部展示。
            if (ellipsisCount > 0) {
                //整个字符串长度
                int length = textView.getText().length();
                //显示出来的字符串长度(用于截取的坐标)
                int subStrEnd = length - ellipsisCount;
                String text = string.subSequence(0, subStrEnd - ADDED_STRING.length()) + "";
                TextClickUtils.setTagClicks(context, textView, text + ADDED_STRING, returnTag -> {
                    if (onContentClickListener != null) {
                        onContentClickListener.onContentClick(returnTag);
                    }
                }, "更多");
            } else {
                textView.setText(string);
            }
        });
    }
    
	public interface OnContentClickListener {
        void onContentClick(String returnTag);
    }

调用方法如下:

	TextView tvPrivacyMore = (TextView) findViewById(R.id.tv_more);
    String content1 = "物联网中的设备产生大量的数据,数据都上传到云端进行处理,会对云端造成巨大的压力,为分担中心云节点的压力,边缘计算节点可以负责自己范围内的数据计算和存储工作。";
    TextClickUtils.setEndTextClick(SecondActivity.this, tvPrivacyMore, content1, returnTag -> {
        Toast.makeText(SecondActivity.this, returnTag, Toast.LENGTH_SHORT).show();
    });

以上为全部内容
工具类下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值