2013-03-22 37 views
14

Tôi có TextView với chiều rộng là wrap content. Trong văn bản này TextView Tôi đặt văn bản, nhưng văn bản không có cùng độ dài mỗi lần. Khi văn bản rất dài, tôi sử dụng một dòng đúng và ellipsize: kết thúc. Nhưng bây giờ tôi có một vấn đề. Tôi muốn đặt Mức độ hiển thị của bố cục khác nhưng điều đó phụ thuộc vào độ dài văn bản của tôi. Nếu văn bản quá dài để vừa với màn hình tôi muốn setVisible true, nhưng khi văn bản ngắn và khi tôi không cần ellipsize, tôi muốn đặt hiển thị sai. Vì vậy, tôi cần phải kiểm tra trạng thái của TextView của tôi. Khi hình elip của nó, tôi muốn setVisible đúng, khi không phải là số setVisible sai. Làm thế nào tôi có thể làm điều đó. Đây là những gì tôi nhận được:Kiểm tra xem xem văn bản có bị bỏ qua trong 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); 

     } 

nhưng giải pháp này không hoạt động.

+0

mã bưu điện. cho biết nếu có bất kỳ lỗi nào. để mọi người hiểu rõ hơn những gì bạn muốn hỏi và chính xác là vấn đề của bạn ở đâu. –

+0

Bản sao có thể có của [Làm cách nào để biết liệu chế độ xem văn bản của tôi đã được bỏ qua?] (Http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been-ellipsized) –

Trả lời

43

Bạn có thể sử dụng phương pháp này cung cấp: 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"); 
     } 
    } 
} 

nơi dòng có thể thu được qua getLineCount()

+0

Bạn có thể chỉ cho tôi bất kỳ ví dụ nào về phương pháp này không? – user1302569

+0

Chỉ cần gọi phương thức trên chế độ xem văn bản của bạn. Đã thêm mã. (không được thử nghiệm) – Calvin

+0

hoạt động tuyệt vời, cảm ơn bạn – user1302569

1

Sử dụng getEllipsisCount sẽ không làm việc với văn bản có dòng trống bên trong nó. Tôi đã sử dụng đoạn mã sau để làm cho nó hoạt động:

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; 
     } 
    }); 

Đảm bảo không đặt maxLineCount trong XML của bạn. Sau đó, bạn có thể kiểm tra lineCount trong mã của mình và nếu nó lớn hơn một số nhất định, bạn có thể trả về false để hủy bản vẽ của TextView và đặt số lượng dòng cũng như cờ để lưu xem textView có quá dài hay không không phải. Chế độ xem văn bản sẽ vẽ lại với số dòng chính xác và bạn sẽ biết liệu nó có được bỏ qua hay không với cờ.

Sau đó, bạn có thể sử dụng cờ isEllipsized để làm bất cứ điều gì bạn yêu cầu.

+0

Tôi giả sử 'm.isEllipsized' chỉ là một cờ được đặt trên lớp chứa khối mã trong thí dụ – Muxa

8

Vâng, giải pháp được chấp nhận không hoạt động nhưng bỏ lỡ một vài trường hợp góc vì nó sẽ chỉ kiểm tra dòng cuối cùng cho các ký tự bị bỏ qua. Nếu chúng ta có một TextView bao gồm hai dòng và sử dụng TruncateAt.START để cắt bớt văn bản ở đầu của nó, câu trả lời được chấp nhận sẽ thất bại. : -/

Thêm một số ViewTreeObserver.OnPreDrawListener có vẻ giống như một chi phí thực sự đắt tiền cho tôi. Vì vậy, tôi đã thực hiện các cải tiến sau cho mã của câu trả lời được chấp nhận:

/** 
* 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; 
} 

Vẫn còn chỗ để cải thiện. Nhưng phương pháp này có đủ các trường hợp sử dụng của tôi. Sửa chữa và cải tiến được đánh giá cao. :-)

Các vấn đề liên quan