需求如下图所示,红框框内是个html形式的字符串,点击绿色框框,复制到微信号,(客服微信号末尾3位我用***代替,应该不会有影响代码运行结果。)
String strHtml="1.填写的真实姓名应与微信实名一致,输入错误您将无法提现 <br>\r\n提现请添加客服微信<a href=\"jrbk://kaijia.com/copy?text=luxiaoyun***\"><font color=\"#ff0000\"><u>luxiaoyun***</u>点击复制</font></a>并备注您的真实姓名"
在TextView关联布局后写下面两行代码即可
tvWithdrawalNotice.setText(Html.fromHtml(strHtml));//把Html形式的字符串设置给TextView
setOnClickHtml();//设置点击事件和复制事件
private void setOnClickHtml(){
tvWithdrawalNotice.setMovementMethod(LinkMovementMethod.getInstance());
CharSequence str = tvWithdrawalNotice.getText();
if(str instanceof Spannable){
int end = str.length();
Spannable sp = (Spannable)tvWithdrawalNotice.getText(); //构建Spannable对象、继承Spanned、Spanned对象继承CharSequener
URLSpan[] urls=sp.getSpans(0, end, URLSpan.class); //找出text中的a标签
//SpannableStringBuilder、SpannableString对象跟String对象差不多、只是比String对象多setSpan,
//可以给字符串设置样式、大小、背景色...而 SpannableStringBuilder跟SpannableString的关系就跟String跟StringBuffer关系一样
SpannableStringBuilder Spannable=new SpannableStringBuilder(str);
Spannable.clearSpans();//此处需要清除上次的SpannableStringBuilder
for(URLSpan url : urls){
MyClickSpan myURLSpan = new MyClickSpan(url);
//设置样式其中参数what是具体样式的实现对象,start则是该样式开始的位置,end对应的是样式结束的位置,
// 参数 flags,定义在Spannable中的常量
Spannable.setSpan(myURLSpan,sp.getSpanStart(url),sp.getSpanEnd(url),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tvWithdrawalNotice.setText(Spannable);
}
}
private class MyClickSpan extends ClickableSpan{
String urlHtml;
private MyClickSpan(URLSpan url){
urlHtml=url.getURL();
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
super.updateDrawState(ds);
}
@Override
public void onClick(View widget) {
//点击链接或则弹出对话框,对文字等等进行处理都在该处进行
// 备注: urlHtml= jrbk://kaijia.com/copy?text=luxiaoyun***,复制的内容是luxiaoyun***
String as="jrbk://kaijia.com/copy?text="
String copyText=urlHtml.substring(as.length());
copyText(copyText);
}
}
//复制String类型的方法
public void copyText(String text) {
if (text == null) {
Toast.makeText(this, "复制失败", Toast.LENGTH_SHORT).show();
} else {
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
// 将文本内容放到系统剪贴板里。
ClipData mClipData = ClipData.newPlainText("Label", text);
cm.setPrimaryClip(mClipData);
Toast.makeText(this, "复制成功!", Toast.LENGTH_SHORT).show();
}
}
至此任务完成
注意:所有的点击响应事件(复制,谈对话框,跳转界面等等事件)都在MyClickSpan的onClick里面执行