介紹
最近在做社區(qū)類APP,因此避免不了會有如QQ、微信一般的評論,點擊TextView發(fā)布人或評論人的昵稱查看詳情,支持超鏈接,支持emoji表情,下面為大家分享下我在項目中所解決的問題,還希望大家有更好方法可以提出。我均會使用本項目中的圖片為大家介紹。
1、文本支持高亮和點擊
如下圖,我們想在TextView實現(xiàn)高亮,并且還支持點擊。

利用ClickableSpan讓TextView支持高亮點擊,我們新建幾個類繼承ClickableSpan,一般我們有兩個方法需要重寫,分別是updateDrawState和onClick,默認情況下此時TextView會顯示默認的主題顏色和有下劃線,因此我們可以在updateDrawState對這個進行設置,如下:
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//設置高亮顏色
ds.setColor(ContextCompat.getColor(mContext, R.color.accent));
//不顯示下劃線
ds.setUnderlineText(false);
}
之后,我們可以在onClick方法中對點擊事件進行設置,一般我們會盡心跳轉操作,因此會傳遞參數(shù),此時我們可以重寫構造方法,對需要的參數(shù)進行傳遞,整個類的完整代碼如下:
public class NameClick extends ClickableSpan {
private String mId;//用戶ID
public NameClick(String id) {
mId = id;
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//設置高亮顏色
ds.setColor(ContextCompat.getColor(mContext, R.color.accent));
//不顯示下劃線
ds.setUnderlineText(false);
}
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, GroupPersonInfoActivity.class);
intent.putExtra("id", mId);
mContext.startActivity(intent);
}
}
接著我們開始設置TextView,我們結合SpannableString來設置,代碼如下:
//設置回復人點擊事件,data.getUname為高亮的回復人
SpannableString spanUname = new SpannableString(data.getUname());
spanUname.setSpan(new NameClick(data.getUid()), 0, spanUname.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.textView.append(spanUname);
通過以上設置我們基本可以實現(xiàn)高亮顯示,但是此時并不能進行點擊,還得為TextView加上一行代碼。
//然后TextView支持點擊
holder.textView.setMovementMethod(LinkMovementMethod.getInstance());
此時已經(jīng)可以點擊,但是點擊后會出現(xiàn)個默認點擊背景,可能有時候我們并不需要,或者想改變背景,我們可以通過下面代碼實現(xiàn)。
//設置點擊效果為透明,您也可以設置其他顏色,這個為點擊背景。
holder.textView.setHighlightColor(Color.TRANSPARENT);
TextView完整實現(xiàn)代碼如下:
//設置回復人點擊事件,data.getUname為高亮的回復人
SpannableString spanUname = new SpannableString(data.getUname());
spanUname.setSpan(new NameClick(data.getUid()), 0, spanUname.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.textView.append(spanUname)
//然后TextView支持點擊
holder.textView.setMovementMethod(LinkMovementMethod.getInstance());
//設置點擊效果為透明,您也可以設置其他顏色,這個為點擊背景。
holder.textView.setHighlightColor(Color.TRANSPARENT);
到此已經(jīng)可以滿足我們的需求了,但是作為RecyclerView或者ListView的item使用時,我們還未遇到點擊高亮文本時,item的點擊事件也會隨之進行響應,并且會有兩個點擊效果(高亮文本的點背景和item點擊背景)這樣是非常丑的,因此我想到的是一個是當點擊高亮文本時,攔截點擊事件讓它不傳遞給item,一個是分治法,為高亮文本和正常文本分別設置ClickableSpan。兩個方法均可行,但是在只有本文所描述的情況下使用第一種方法,點擊item時,包括高亮文本的整個item都會有點擊背景,當然這個是我們不希望看到的,很自然我們得為兩者分別設置ClickableSpan。正常文本的代碼可如下:
public class ItemClick extends ClickableSpan {
private int mPosition;//item的所在位置
public ItemClick(int position) {
mPosition = position;
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//設為正常文本顏色
ds.setColor(ContextCompat.getColor(mContext, R.color.primary_text));
//不顯示下劃線
ds.setUnderlineText(false);
}
@Override
public void onClick(View view) {
//如果設置了點擊事件,把事件傳遞給item
if (mItemClickListener != null){
mItemClickListener.onItemClick(view, mPosition);
}
}
}
經(jīng)過以上實現(xiàn)我們基本可以實現(xiàn)類似QQ、微信的評論回復效果。如果大家遇到有更好的方法或者有錯誤的問題可以及時評論。
2、讓TextView支持emoji表情
如下圖,我們可以看到有emoji表情,雖然這個很簡單,但是在社交功能中是必不可少的。

這個我們可以直接下載Apache Commons Lang,然后把jar拿來用,在這里我們可以使用如下代碼:
//把字符串轉為unicode編碼
StringEscapeUtils.escapeJava(etContent.getText().toString())
//解碼unicode編碼
StringEscapeUtils.unescapeJava(data.getContent())
通過轉碼和解碼我們就可以支持emoji表情,當然這個jar包還是有很多方法的,大家可以自行查詢文檔學習。
3、讓TextView對超鏈接自動識別,并解決在RecyclerView和ListView遇到的問題。
-----稍后更新。