TextView高級用法

介紹

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

1、文本支持高亮和點擊

如下圖,我們想在TextView實現(xiàn)高亮,并且還支持點擊。


F06DBC62-08FF-4831-BA06-B9C30295A343.png

利用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表情,雖然這個很簡單,但是在社交功能中是必不可少的。

F06DBC62-08FF-4831-BA06-B9C30295A343.png

這個我們可以直接下載Apache Commons Lang,然后把jar拿來用,在這里我們可以使用如下代碼:

//把字符串轉為unicode編碼
StringEscapeUtils.escapeJava(etContent.getText().toString())
//解碼unicode編碼
StringEscapeUtils.unescapeJava(data.getContent())

通過轉碼和解碼我們就可以支持emoji表情,當然這個jar包還是有很多方法的,大家可以自行查詢文檔學習。

3、讓TextView對超鏈接自動識別,并解決在RecyclerView和ListView遇到的問題。

-----稍后更新。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容