2013-01-05 24 views
17

Tôi có một số TextView với chiều cao tối đa không xác định, phụ thuộc vào độ phân giải DPI/màn hình của thiết bị. Vì vậy, ví dụ, trên và thiết bị MDPI chiều cao tối đa này làm cho nó có thể hiển thị chỉ có 2 dòng tại một thời điểm, một giá trị có thể được tăng lên đến một số không xác định.Phép tối ưu hóa không hoạt động bình thường đối với một TextView đa dòng với chiều cao tối đa tùy ý

Sự cố của tôi liên quan đến chức năng bỏ qua. Giả sử rằng một thiết bị nhất định cho phép hiển thị 4 dòng. Nếu tôi đặt số lượng dòng tối đa theo cách thủ công, như thế này ...

<TextView 
    android:id="@+id/some_id" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:ellipsize="end" 
    android:maxLines="4" 
    android:singleLine="false" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="This is some really really really really really long text" 
    android:textSize="15sp" /> 

... mọi thứ hoạt động OK. Nếu văn bản không phù hợp đúng cách, sau đó ellipsis được thêm vào cuối dòng thứ tư, như thế này:

This is some 
really really 
really really 
really long... 

Nhưng tôi thà không thiết lập số dòng như là một biến tĩnh, vì tôi muốn bao gồm hỗ trợ cho bất kỳ sự kết hợp nào của độ phân giải DPI/màn hình. Vì vậy, nếu tôi có thể ngưng maxLines ellipsis được hiển thị không còn chính xác ở dòng bốn, cho thấy thay vì một phần chưa đầy đủ của văn bản:

This is some 
really really 
really really 
really long 

Nếu tôi hơi tăng kích thước TextView, tôi có thể thấy rằng phần còn lại của văn bản vẫn là được rút ra "đằng sau" khác Views. Đặt biến số maxHeight dường như không hoạt động.

Tôi thực sự không thể tìm ra giải pháp cho vấn đề này. Ý tưởng nào? Nếu nó giúp, tôi chỉ làm việc với Android v4.0.3 trở lên (API cấp 15).

Trả lời

27

Tính số lượng đường phù hợp với TextView với TextView#getHeight()TextView#getLineHeight(). Sau đó, gọi TextView#setMaxLines().

ViewTreeObserver observer = textView.getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int maxLines = (int) textView.getHeight() 
       /textView.getLineHeight(); 
     textView.setMaxLines(maxLines); 
     textView.getViewTreeObserver().removeGlobalOnLayoutListener(
       this); 
    } 
}); 
+0

Hoạt động hoàn hảo. Cảm ơn nhiều! – DPR

+0

Godlike! Lưu ngày của tôi! – Roman

+2

Lưu ý: chiều cao của dòng có thể thay đổi! Và phương thức getLineHeight sẽ không hoạt động như mong đợi. Điều này có thể xảy ra, ví dụ khi sử dụng spannables để làm cho kích thước phông chữ lớn hơn trong một phần cụ thể của văn bản. –

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