2013-08-06 42 views
11

Tôi có bố cục ứng dụng Android có chứa TextView nhiều dòng hay không. Khi màn hình ở hướng dọc, TextView có thể hiển thị độ dài văn bản khác nhau khi chạy ở chế độ ngang. Ngoài ra khi chạy trên một màn hình nhỏ, TextView có thể hiển thị độ dài văn bản khác nhau khi chạy trên màn hình lớn hơn.Android TextView đa dòng, kiểm tra xem văn bản có phù hợp không, hoặc kiểm tra xem TextView có đầy đủ

Có cách nào tôi có thể kiểm tra xem văn bản có phù hợp hoặc sẽ bị cắt bớt không? Hoặc là có cách nào tôi có thể kiểm tra nếu TextView nếu đầy đủ?

Vấn đề là TextView có khả năng có thể chứa một số lượng khác nhau của dòng, tùy thuộc vào việc nó là phong cảnh, chân dung, màn hình nhỏ, màn hình lớn, vv

Cảm ơn bạn cho lời khuyên của bạn,

nhất regards,

James

Trả lời

0

Đối với kiểm tra xem một multiline (hoặc không) TextView sẽ được rút ngắn, kiểm tra this post.

Hoặc, bạn đã xem xét sử dụng chế độ xem văn bản cuộn chưa? (marquee) .. nơi mà các văn bản sẽ di chuyển theo (theo chiều ngang, hoạt hình) nếu nó là quá dài cho một chiều rộng nhất định?

Dưới đây là một TextView dụ trong một file bố trí, có một số các đặc điểm:

<TextView 
    android:id="@+id/sometextview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="marquee" 
    android:marqueeRepeatLimit="marquee_forever" 
    android:singleLine="true" 
    android:scrollHorizontally="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:freezesText="true" 
    android:textColor="#808080" 
    android:textSize="14sp" 
    android:text="This is a long scrolling line of text.. (etc)"/> 
+0

Về XML của bạn, điều này sẽ không hoạt động đối với tôi vì nó đặt singleLine = "true" không phải là một TextView MULTILINE. Về kiểm tra bài đăng này, điều này sẽ không làm việc cho tôi bởi vì "testPaint.measureText (văn bản)" chỉ tính toán chiều rộng văn bản. Nó không tính toán chiều cao văn bản cho một TextView MULTILINE. Tôi đã tìm thấy một giải pháp khác bây giờ, mà tôi sẽ thêm ngay. – James

+0

câu trả lời đó không đối phó với chế độ xem văn bản nhiều dòng. Nó chỉ kiểm tra xem văn bản có lấp đầy * chiều rộng * của textveiw hay không – LairdPleng

+0

Câu hỏi này không chỉ hỏi về multiline; nó cũng hỏi về "phù hợp" trong một textview ... – MiStr

3

Về cơ bản, bạn cần phải tính toán kích thước của TextView của bạn và kích thước của văn bản khi chế độ định hướng thay đổi . Hãy thử ViewTreeObserver.OnGlobalLayoutListener để làm như vậy.

Bên trong phương pháp thay đổi hướng:

main_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      main_view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      //Calculation goes here 
      int text_size = getTextSize(text_view.getText().toString()); 
      int text_view_size = text_view.getLayoutParams().width; 
      //Compare your text_size and text_view_size and do whatever you want here. 
     } 
    }); 

Đây là mã của tính toán text_size:

private int getTextSize(String your_text){ 
    Paint p = new Paint(); 
    //Calculate the text size in pixel 
    return p.measureText(your_text); 
} 

Hope trợ giúp này.

+1

Điều này sẽ không làm việc cho tôi bởi vì "p.measureText (your_text)" chỉ tính toán chiều rộng văn bản. Nó không tính toán chiều cao văn bản cho một TextView MULTILINE. Tôi đã tìm thấy một giải pháp khác bây giờ, mà tôi sẽ thêm ngay. – James

8

Tôi đã tìm thấy một "táo bạo" giải pháp cho vấn đề đo chiều cao của văn bản trong một MULTILINE TextView : -

//Calculate the height of the text in the MULTILINE TextView 
int textHeight = textView.getLineCount() * textView.getLineHeight(); 
if (textHeight > textViewHeight) { 
    //Text is truncated because text height is taller than TextView height 
} else { 
    //Text not truncated because text height not taller than TextView height 
} 

Tuy nhiên giải pháp này có một số hãy cẩn thận: -

Đầu tiên liên quan đến getLineHeight(), đánh dấu bên trong văn bản có thể khiến các dòng riêng lẻ cao hơn hoặc ngắn hơn chiều cao này và bố cục có thể chứa thêm phần đệm đầu tiên hoặc dòng cuối cùng. Xem http://developer.android.com/reference/android/widget/TextView.html#getLineHeight()

Thứ hai, ứng dụng cần tính chiều cao thực tế của TextView tính bằng pixel và (trong trường hợp bố cục của tôi) có thể không đơn giản như textView.getHeight() và tính toán có thể khác nhau bố trí bố cục khác.

Tôi muốn giới thiệu tránh LinearLayout vì chiều cao pixel thực tế của TextView có thể khác nhau tùy thuộc vào nội dung văn bản. Tôi đang sử dụng RelativeLayout (xem http://pastebin.com/KPzw5LYd).

Sử dụng này RelativeLayout, tôi có thể tính toán chiều cao TextView của tôi như sau: -

//Calculate the height of the TextView for layout "http://pastebin.com/KPzw5LYd" 
int textViewHeight = layout1.getHeight() - button1.getHeight() - button2.getHeight(); 

Hy vọng rằng sẽ giúp,

Kính trọng,

James

9

Những câu trả lời không làm việc tốt cho tôi. Đây là những gì tôi đã kết thúc làm

Paint measurePaint = new Paint(myTextView.getPaint()); 
float pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?"); 
float labelWidth = myTextView.getWidth(); 
int maxLines = myTextView.getMaxLines(); 

while (labelWidth > 0 && pWidth/maxLines > labelWidth-20) { 
    float textSize = measurePaint.getTextSize(); 
    measurePaint.setTextSize(textSize-1); 
    pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?"); 
    if (textSize < TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_SP, 7, 
      getContext().getResources().getDisplayMetrics())) break; 
} 

myTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, measurePaint.getTextSize()); 

Tôi không nói rằng điều này sẽ làm việc cho mọi tình huống như tôi chắc chắn cắt góc ở đây, nhưng ý tưởng chung là để đo chữ bằng sơn của TextView và giữ thu hẹp nó cho đến khi nó vừa với khung nhìn văn bản.

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