二话不说,先上效果。
文本点击事件工具类
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();
});
以上为全部内容
工具类下载地址

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

被折叠的 条评论
为什么被折叠?



