2013-03-22 78 views
14

中橢圓化我有TextView寬度爲wrap content。在這TextView我設置文本,但文本不是每次都有相同的長度。當文本很長時,我使用單行true和ellipsize:end。但現在我有一個問題。我想設置其他佈局的可見性,但這取決於我的文本的長度。如果文本太長而無法放入屏幕中,我希望將其設置爲true,但是當文本短並且不需要橢圓化時,我想將可見性設置爲false。所以我需要檢查我的TextView的狀態。當它的橢圓我想setVisible爲真,當其不爲setVisible爲假。我如何做到這一點。 這是我的了:檢查文本視圖是否在android

tvAle.post(new Runnable() { 

     @Override 
     public void run() { 

      int lineCount = tvAle.getLineCount(); 
      Paint paint = new Paint(); 
      paint.setTextSize(tvAle.getTextSize()); 
      final float size = paint.measureText(tvAle.getText().toString()); 
      Log.v("a", ""+size+" "+tvAle.getWidth()); 
      if ((int)size > (tvAle.getWidth()+10)) { 
       allergiesLayout.setVisibility(View.VISIBLE); 
      } 

      else 
       allergiesLayout.setVisibility(View.GONE); 

     } 

但這種方法是行不通的。

+0

郵政編碼。告訴是否有任何錯誤。讓人們更好地理解你想問什麼以及你的問題到底在哪裏。 – 2013-03-22 09:54:17

+0

[我如何知道我的textview是否已被省略號?]可能的重複(http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been-ellipsized) – 2015-12-01 15:42:21

回答

43

您可以使用提供這種方法:getEllipsisCount

Layout layout = textview1.getLayout(); 
if(layout != null) { 
    int lines = layout.getLineCount(); 
    if(lines > 0) { 
     int ellipsisCount = layout.getEllipsisCount(lines-1); 
     if (ellipsisCount > 0) { 
      Log.d(TAG, "Text is ellipsized"); 
     } 
    } 
} 

這裏可以通過getLineCount()

+0

你能告訴我任何這種方法的例子嗎? – user1302569 2013-03-22 10:15:50

+0

只需在你的textview上調用一個方法即可。增加了代碼。 (未測試) – Calvin 2013-03-22 10:24:21

+0

很好用,謝謝 – user1302569 2013-03-22 10:32:42

1

獲得線使用getEllipsisCount不會與在其內具有空行文本。我使用以下代碼使其工作:

message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 

      if(m.isEllipsized == -1) { 
       Layout l = message.getLayout(); 
       if (message.getLineCount() > 5) { 
        m.isEllipsized = 1; 
        message.setMaxLines(5); 
        return false; 
       } else { 
        m.isEllipsized = 0; 
       } 
      } 
      return true; 
     } 
    }); 

請確保不要在您的XML中設置maxLineCount。然後,您可以檢查代碼中的lineCount,如果它大於某個數字,則可以返回false以取消TextView的繪製並設置行數以及一個標記以保存textView是否過長或不。 textview將再次繪製正確的行數,並且您將知道是否使用該標記進行了橢圓化。

然後,您可以使用isEllipsized標誌來執行您所需的任何操作。

+0

我假設'm.isEllipsized'只是一個標誌設置的類包含代碼塊在例 – Muxa 2016-08-01 00:09:38

8

那麼,接受的解決方案確實會工作,但會錯過幾個角落的情況,因爲它只會檢查最後一行的橢圓化字符。如果我們有一個由兩行組成的TextView並使用TruncateAt.START在其開頭截斷文本,則接受的答案將失敗。 : -/

添加一個ViewTreeObserver.OnPreDrawListener似乎更像是一個非常昂貴的開銷給我。所以我對接受的答案的代碼做了如下改進:

/** 
* Checks if the text of the supplied {@link TextView} has been ellipsized. 
* 
* @param textView 
*   The {@link TextView} to check its text. 
* 
* @return {@code True} if the text of the supplied {@code textView} has been ellipsized. 
*/ 
public static boolean isTextViewEllipsized(final TextView textView) { 
    // Initialize the resulting variable 
    boolean result = false; 
    // Check if the supplied TextView is not null 
    if (textView != null) { 
     // Check if ellipsizing the text is enabled 
     final TextUtils.TruncateAt truncateAt = textView.getEllipsize(); 
     if (truncateAt != null && !TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) { 
      // Retrieve the layout in which the text is rendered 
      final Layout layout = textView.getLayout(); 
      if (layout != null) { 
       // Iterate all lines to search for ellipsized text 
       for (int index = 0; index < layout.getLineCount(); ++index) { 
        // Check if characters have been ellipsized away within this line of text 
        result = layout.getEllipsisCount(index) > 0; 
        // Stop looping if the ellipsis character has been found 
        if (result) { 
         break; 
        } 
       } 
      } 
     } 
    } 
    return result; 
} 

雖然還有改進的餘地。但是這種方法確實足夠我的用例。更正和改進表示讚賞。 :-)