您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在android中獲取textview,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
工作中用的一個方法,雖然不算特別準確,但效果還是不錯的,這里分享下。
/** * 獲取textview最大能顯示幾個字 * @param text 文本內容 * @param size 文本字體大小 * @param maxWidth textview的最大寬度 * @return */ private float getLineMaxNumber(String text, float size,float maxWidth) { if (null == text || "".equals(text)){ return 0; } Paint paint = new Paint(); paint.setTextSize(size); //得到文本內容總體長度 float textWidth = paint.measureText(text); // textWidth float width = textWidth / text.length(); float total = maxWidth / width; return total; }
上面這個方法不太精確,不過比較適合在 RecyclerView 或 ListView 里面使用,避免生成太多對象
/** * 獲取textview一行最大能顯示幾個字(需要在TextView測量完成之后) * * @param text 文本內容 * @param paint textview.getPaint() * @param maxWidth textview.getMaxWidth()/或者是指定的數值,如200dp */ private int getLineMaxNumber(String text, TextPaint paint, int maxWidth) { if (null == text || "".equals(text)) { return 0; } StaticLayout staticLayout = new StaticLayout(text, paint, maxWidth, Layout.Alignment.ALIGN_NORMAL , 1.0f, 0, false); //獲取第一行最后顯示的字符下標 return staticLayout.getLineEnd(0); }
利用 StaticLayout 可以非常輕松的得到一行可以顯示的最大字符數
延伸:
對于一個單行 TextView,當字符串超出一行時,如何獲取未顯示的部分字符串?
textview 設定最大行數為 1 后,文本超出了 textview,textView 末尾顯示省略號,我就想知道省略號代表的內容
思路:
假設 TextView 的寬度是在 xml 內設置的具體數值,比如 300dp,
(目的是為了簡化這個問題,如果設置為 match_parent 或者 wrap_content,需要在程序運行時計算其寬度,而直接 getWidth 總是返回 0,比較麻煩。)
比如是這樣配置的:
<TextView android:id="@+id/textView" android:layout_width="300dp" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" />
然后填充了一個超長的字符串,比如這樣:
String str = "If you really want to hear about it, the first thing you'll probably want to know"; 這樣就會導致顯示不全,像這樣: If you really want to hear about it, the first thin... 所以,如果你想得到已顯示的字符個數,或者未顯示的字符個數,那么其中的關鍵是如何計算每一個字符的寬度。 然后遍歷這個字符串,當前n個字符寬度總和,超過TextView寬度時,就得到了已顯示的字符個數。 String str = "If you really want to hear about it, the first thing you'll probably want to know"; mTextView = (TextView) findViewById(R.id.textView); // 計算TextView寬度:xml中定義的寬度300dp,轉換成px float textViewWidth = convertDpToPixel(300); float dotWidth = getCharWidth(mTextView, '.'); Log.d(TAG, "TextView width " + textViewWidth); int sumWidth = 0; for (int index=0; index<str.length(); index++) { // 計算每一個字符的寬度 char c = str.charAt(index); float charWidth = getCharWidth(mTextView, c); sumWidth += charWidth; Log.d(TAG, "#" + index + ": " + c + ", width=" + charWidth + ", sum=" + sumWidth); if (sumWidth + dotWidth*3 >= textViewWidth) { Log.d(TAG, "TextView shows #" + index + " char: " + str.substring(0, index)); break; } } // Dp轉Px private float convertDpToPixel(float dp){ Resources resources = getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); float px = dp * (metrics.densityDpi / 160f); return px; } // 計算每一個字符的寬度 public float getCharWidth(TextView textView, char c) { textView.setText(String.valueOf(c)); textView.measure(0, 0); return textView.getMeasuredWidth(); }
結果如下,在榮耀 3C 和 LG G3 上測試通過(G3 比計算的結果,多顯示了一個字符):
10-22 01:17:42.046: D/Text(21495): TextView width 600.0
10-22 01:17:42.048: D/Text(21495): #0: I, width=8.0, sum=8
10-22 01:17:42.049: D/Text(21495): #1: f, width=9.0, sum=17
10-22 01:17:42.049: D/Text(21495): #2: , width=7.0, sum=24
10-22 01:17:42.049: D/Text(21495): #3: y, width=14.0, sum=38
......
10-22 01:17:42.053: D/Text(21495): #17: t, width=9.0, sum=213
10-22 01:17:42.053: D/Text(21495): #18: , width=7.0, sum=220
10-22 01:17:42.053: D/Text(21495): #19: t, width=9.0, sum=229
......10-22 01:17:42.061: D/Text(21495): #50: n, width=16.0, sum=575
10-22 01:17:42.061: D/Text(21495): #51: g, width=16.0, sum=591
10-22 01:17:42.061: D/Text(21495): TextView shows #51 char: If you really want to hear about it, the first thin
看完上述內容,你們對怎么在android中獲取textview有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。