1. 程式人生 > >實現評論,回覆功能

實現評論,回覆功能

實現跟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();
}
}