日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 单个TextView 点击“显示全部”功能实现方法

發布時間:2023/12/8 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 单个TextView 点击“显示全部”功能实现方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網上很多TextView的“顯示全部”,“顯示更多”的方案實現都是兩個TextView,一個在上面顯示內容,一個在下面用來點擊。但是我在實際工作中遇到的需求是“顯示全部”提示要內聯在原文的后面,使用一個TextView進行顯示,不能放在原文的下面,下面把代碼貼一下,主要實現的功能如下:

1、“顯示全部”/“顯示更多”緊連在正文的后面,不能另起一行

2、當字數超過一定數量顯示“顯示更多”,

3、當行數超過一定數量顯示“顯示更多”,比如每行只有一個字,不停的換行,雖然字少但是行數多,也應該將限制之外的行全部省略掉


效果展示


實現起來非常簡單,主要步驟如下

1、首先判斷要處理段落的字數是否超過限制,如果超過就在后面綴上“顯示更多”

2、判斷要處理段落在某個TextView上完整顯示的行數,如果行數超過限制,那么就顯示“顯示全部”

3、使用SpannableString,構造:削減后的段落+“...顯示更多”。然后將最后“...顯示更多”這個字使用ClickableSpan設置上點擊事件


有以下幾個難點

1、如何在不進行UI繪制的情況下拿到TextView顯示某段文字能顯示多少行

2、如何獲得第x行最后一個字的下標以便從此截取

3、在異步處理的環境中,如何在不進行繪制的情況下獲得TextView會畫多高以便預留位置


首先下面這段代碼是通過傳入一個TextView及其寬度,然后獲得任意一行最末那個字符的下標的方法,只是為了業務方便,獲取的是最大行限制的那一行最后一個字符,如果傳入的文字不到最大行數限制,那么就返回-1,這個函數的作用是如果你要做行數“顯示全部”限制的話,你知道該從一段文字的哪個地方開始截斷。注意下面這個函數一定要在主線程進行執行


/*** get the last char index for max limit row,if not exceed the limit,return -1* @param textView* @param content* @param width* @param maxLine* @return*/public static int getLastCharIndexForLimitTextView(TextView textView, String content, int width, int maxLine){Log.i("Alex","寬度是"+width);TextPaint textPaint = textView.getPaint();StaticLayout staticLayout = new StaticLayout(content, textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);if(staticLayout.getLineCount()>maxLine) return staticLayout.getLineStart(maxLine) - 1;//exceedelse return -1;//not exceed the max line}下面這個函數是在上面函數的基礎上,在不繪制UI的前提下,計算一段文本顯示的高度,獲得它高度的主要目的是為了占位高度,免得上下滑動的時候屏幕跳躍,方便異步的顯示這些文字。下面的代碼在邏輯上做了相應的具體業務的處理,如果文字沒有超出最大行數,那么就返回這段文字實際高度,如果超過了最大行數,那么就只返回最大行數之內的文本的高度
/*** 在不繪制textView的情況下算出textView的高度,并且根據最大行數得到應該顯示最后一個字符的下標,請在主線程順序執行,第一個返回值是最后一個字符的下標,第二個返回值是TextView最終應該占用的高度* @param textView* @param content* @param width* @param maxLine* @return*/public static int[] measureTextViewHeight(TextView textView, String content, int width, int maxLine){Log.i("Alex","寬度是"+width);TextPaint textPaint = textView.getPaint();StaticLayout staticLayout = new StaticLayout(content, textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);int[] result = new int[2];if(staticLayout.getLineCount()>maxLine) {//如果行數超出限制int lastIndex = staticLayout.getLineStart(maxLine) - 1;result[0] = lastIndex;result[1] = new StaticLayout(content.substring(0, lastIndex), textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false).getHeight();return result;}else {//如果行數沒有超出限制result[0] = -1;result[1] = staticLayout.getHeight();return result;}}


下面的函數就是上面效果展示中展示的例子,通過上面在不繪制UI的前提下獲得最大行末尾文字下標,然后讓源字符串subString這個下標,在獲得的結果上加上“...read more”,然后將添加這一段文字設置點擊事件,一個“顯示更多”的功能就做好了。

/*** 限制為300字符,并且添加showmore和show more的點擊事件* @param summerize* @param textView* @param clickListener textview的clickListener*/public static void limitStringTo140(String summerize, final TextView textView, final View.OnClickListener clickListener){final long startTime = System.currentTimeMillis();if(textView==null)return;int width = textView.getWidth();//在recyclerView和ListView中,由于復用的原因,這個TextView可能以前就畫好了,能獲得寬度if(width==0)width = 1000;//獲取textview的實際寬度,這里可以用各種方式(一般是dp轉px寫死)填入TextView的寬度int lastCharIndex = getLastCharIndexForLimitTextView(textView,summerize,width,10);if(lastCharIndex<0 && summerize.length() <= 300){//如果行數沒超過限制textView.setText(summerize);return;}//如果超出了行數限制textView.setMovementMethod(LinkMovementMethod.getInstance());//this will deprive the recyclerView's focusif(lastCharIndex>300 || lastCharIndex<0)lastCharIndex=300;String explicitText = null;if(summerize.charAt(lastCharIndex)=='\n'){//manual enterexplicitText = summerize.substring(0,lastCharIndex);}else if(lastCharIndex > 12){//TextView auto enterJLogUtils.i("Alex","the last char of this line is --"+lastCharIndex);explicitText = summerize.substring(0,lastCharIndex-12);}int sourceLength = explicitText.length();String showmore = "show more";explicitText = explicitText + "..." + showmore;final SpannableString mSpan = new SpannableString(explicitText);final String finalSummerize = summerize;mSpan.setSpan(new ClickableSpan() {@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setColor(textView.getResources().getColor(R.color.blue4d9cf2));ds.setAntiAlias(true);ds.setUnderlineText(false);}@Overridepublic void onClick(View widget) {//"...show more" click eventLog.i("Alex", "click showmore");textView.setText(finalSummerize);textView.setOnClickListener(null);new Handler().postDelayed(new Runnable() {@Overridepublic void run() {if (clickListener != null)textView.setOnClickListener(clickListener);//prevent the double click}}, 20);}}, sourceLength, explicitText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);textView.setText(mSpan);Log.i("Alex", "字符串處理耗時" + (System.currentTimeMillis() - startTime));}


總結

以上是生活随笔為你收集整理的Android 单个TextView 点击“显示全部”功能实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久一区二区 | 午夜啪啪福利视频 | jizz在线免费观看 | 亚洲小视频 | 国产ts三人妖大战直男 | 免费观看91视频 | 无人在线观看高清视频 | fc2ppv色の美マンに中出し | 激情久久网站 | 欧美一区二区三区激情视频 | 久久精品免费一区二区 | 久久黄色网址 | 欧美偷拍少妇精品一区 | 国产精品色图 | 热热久 | 中文字幕在线观看一区二区三区 | 夏目彩春娇喘呻吟高潮迭起 | 欧美内谢 | 黄色录像一级大片 | 中文字幕一区二区人妻痴汉电车 | 免费看一级 | 国产精久久| 熟女人妻一区二区三区免费看 | 成人夜晚看av | 亚洲男女一区二区三区 | 精品色哟哟 | 国产男女猛烈无遮挡免费视频动漫 | 中文字幕一区二区三区乱码人妻 | 黄网站在线播放 | 天堂在线网 | xxxx毛片| 最新天堂av | 羞羞成人 | 成人免费视频网站在线看 | 国产乱国产乱300精品 | 成人乱人乱一区二区三区 | 青娱乐最新地址 | 日韩诱惑 | 黑人性xxx | 人人搞人人插 | 成人午夜视频在线播放 | 国产视频污在线观看 | 久久久久久久综合色一本 | 叶全真三级 | 久久两性视频 | 不卡av电影在线观看 | 亚洲国产欧美在线观看 | 一级片黑人| 在线视频一区二区 | 国产成人久久精品流白浆 | 精品在线第一页 | 日本熟妇成熟毛茸茸 | 毛片高清免费 | 国偷自产视频一区二区久 | 午夜性生活视频 | 日本激情小视频 | 一本久久精品一区二区 | 亚洲自啪 | 91中文字幕在线播放 | 国产视色 | www黄色网址| 尤物久久| 精品久久一二三区 | 欧美日韩人妻精品一区二区三区 | 午夜精品在线 | 黄色小说网站在线观看 | 久久精品伊人 | 亚洲国产精品综合久久久 | 午夜性色福利视频 | 久久在线免费观看视频 | 久久久精品日韩 | 成人春色影视 | 夜夜视频 | 韩国女同性做爰三级 | 可以看的av网站 | 久久99热这里只频精品6学生 | 国产免费一区二区三区最新不卡 | 夜夜爽日日澡人人添 | 国产美女精品人人做人人爽 | 一本不卡| 久久精品婷婷 | 欧美v亚洲 | 人人艹人人 | 自拍偷拍亚洲视频 | 哪里可以看免费毛片 | 男人的天堂a在线 | 亚洲一区在线播放 | 亚洲国产一区视频 | 婷婷综合激情 | 97视频在线| 99av国产精品欲麻豆 | 在线免费av网址 | 青青一区二区 | 日韩成人在线免费观看 | 国产网友自拍视频 | 午夜亚洲aⅴ无码高潮片苍井空 | kk视频在线观看 | 三级男人添奶爽爽爽视频 | av中文字幕av |