实现跟qq空间和朋友圈一样的评论,回复功能,一个textView中的文字,有的字体颜色不同,而且具备点击效果,之前想办法用多个textview来实现,但是碰到换行的问题,然后就用了个相对布局把回复的textview叠加在别的textview上面,但是这样一来要计算评论人和回复人的textview的文字长度,但是这样会遇到另外一个问题就是需要耗时操作,会直接卡在那里(ANR),开子线程也是行不通。应为这个我是用2个listview嵌套在一起来实现的,第二个listview是需要动态计算长度的。最终用了以下的方法,便可以轻松实现
方法如下
//需要非常注意的是:设置部分字体颜色的代码必须写在设置文字点击事件的下面,不然设置字体颜色会没有效果(默认是绿色的),之前看网上很多资料都没介绍到这个点,结果自己查了老半天都没搞定,最后改变了一下字体效果就成功了
final String replyNickName = "喊美美啊"; final String commentNickName ="欧巴沙拉呦"; String replyContentStr = "你写的文章非常好,我很喜欢"; //用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果 //Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括) //Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括) //Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括) //Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括) SpannableString ss = new SpannableString(replyNickName+"回复"+commentNickName +":"+replyContentStr); //为回复的人昵称添加点击事件 ss.setSpan(new TextSpanClick(true), 0, replyNickName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //为评论的人的添加点击事件 ss.setSpan(new TextSpanClick(false),replyNickName.length() + 2, replyNickName.length() + commentNickName.length() + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new ForegroundColorSpan(Color.RED),0, replyNickName.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); ss.setSpan(new ForegroundColorSpan(Color.RED),replyNickName.length()+2, replyNickName.length()+commentNickName.length()+2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //添加点击事件时,必须设置 tvContent.setText(ss); tvContent.setMovementMethod(LinkMovementMethod.getInstance());//部分字体点击效果的监听如下
private final class TextSpanClick extends ClickableSpan { private boolean status; public TextSpanClick(boolean status){ this.status = status; } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setUnderlineText(false);//取消下划线 } @Override public void onClick(View v) { String msgStr =""; if(status){ msgStr = "我是回复的人"; }else{ msgStr = "我是评论的人"; } Toast.makeText(FoodDetail.this, msgStr, Toast.LENGTH_SHORT).show(); } }