安卓TextView內(nèi)容折疊實(shí)現(xiàn)「查看全部」和「收起」并且進(jìn)行封裝

前言

由于TextView有些時(shí)候的內(nèi)容太多,跳轉(zhuǎn)二級(jí)頁(yè)面顯示又多此一舉,設(shè)置layout_height為wrap_content又占用當(dāng)前頁(yè)面太多UI,整體布局不好看,于是乎就需要現(xiàn)在這個(gè)方法解決了,在參考了部分資料的基礎(chǔ)上,簡(jiǎn)單的封裝了工具類。

一、先上圖

image

二、直接上代碼,已經(jīng)封裝好的工具類


public class MyMoreText implements View.OnClickListener {
    private SpannableString eclipseString;    //收起的文字
    private SpannableString notEclipseString; //展開的文字
    private TextView textView;
 
    private static class MoreTextHolder {
        @SuppressLint("StaticFieldLeak")
        private static final MyMoreText INSTANCE = new MyMoreText();
    }
 
    public static MyMoreText getInstance() {
        return MyMoreText.MoreTextHolder.INSTANCE;
    }
 
    public void getLastIndexForLimit(TextView tv, int maxLine, String content) {
        this.textView = tv;
        //獲取TextView的畫筆對(duì)象
        TextPaint paint = textView.getPaint();
        //每行文本的布局寬度
        int width = MyApplication.getInstance().getResources().getDisplayMetrics().widthPixels - dip2px(MyApplication.getInstance(), 40);
        //實(shí)例化StaticLayout 傳入相應(yīng)參數(shù)
        StaticLayout staticLayout = new StaticLayout(content, paint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);
        //判斷content是行數(shù)是否超過(guò)最大限制行數(shù)3行
        if (staticLayout.getLineCount() > maxLine) {
            //定義展開后的文本內(nèi)容
            String string1 = content + "    收起";
            notEclipseString = new SpannableString(string1);
            //給收起兩個(gè)字設(shè)成藍(lán)色
            notEclipseString.setSpan(new ForegroundColorSpan(Color.parseColor("#0079e2")), string1.length() - 2, string1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            //獲取到第三行最后一個(gè)文字的下標(biāo)
            int index = staticLayout.getLineStart(maxLine) - 1;
            //定義收起后的文本內(nèi)容
            String substring = content.substring(0, index - 4) + "..." + "查看全部";
            eclipseString = new SpannableString(substring);
            //給查看全部設(shè)成藍(lán)色
            eclipseString.setSpan(new ForegroundColorSpan(Color.parseColor("#0079e2")), substring.length() - 4, substring.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            //設(shè)置收起后的文本內(nèi)容
            tv.setText(eclipseString);
            tv.setOnClickListener(this);
            //將textView設(shè)成選中狀態(tài) true用來(lái)表示文本未展示完全的狀態(tài),false表示完全展示狀態(tài),用于點(diǎn)擊時(shí)的判斷
            tv.setSelected(true);
        } else {
            //沒(méi)有超過(guò) 直接設(shè)置文本
            tv.setText(content);
            tv.setOnClickListener(null);
        }
    }
 
    /**
     * 根據(jù)手機(jī)的分辨率從 dp 的單位 轉(zhuǎn)成為 px(像素)
     */
    private static int dip2px(Context mContext, float dpValue) {
        final float scale = mContext.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
 
    @Override
    public void onClick(View view) {
        if (view.isSelected()) {
            //如果是收起的狀態(tài)
            textView.setText(notEclipseString);
            textView.setSelected(false);
        } else {
            //如果是展開的狀態(tài)
            textView.setText(eclipseString);
            textView.setSelected(true);
        }
    }
}

三、為避免回調(diào)工具類的時(shí)候使用context而導(dǎo)致的弱引用問(wèn)題,此處使用application


public class MyApplication extends Application {
    private static MyApplication instance;
 
    public static MyApplication getInstance() {
        return instance;
    }
 
    public static Context mAppContext = null;
 
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }
}

四、直接調(diào)用工具類使用

//目標(biāo)textView,顯示內(nèi)容的行數(shù),textView具體內(nèi)容
MyMoreText.getInstance().getLastIndexForLimit(tvCheckYJ, 2, result.getCheckrecordinfo().getCheckyj());

五、完結(jié)。如有疑問(wèn)請(qǐng)留言,如喜歡可以點(diǎn)個(gè)贊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容