2011-09-16 24 views
20

Tôi có chế độ xem văn bản nhiều dòng được đặt thành android:layout_width="wrap_content" khi được hiển thị, có tất cả chiều rộng có sẵn của cấp độ gốc. Khi văn bản có thể vừa trên một dòng, wrap_content hoạt động tốt, nhưng ở hai hoặc nhiều dòng, chế độ xem văn bản có vẻ khớp với chiều rộng của bố mẹ, để lại phần trông giống như phần đệm ở hai bên.Tại sao nội dung quấn trong nhiều dòng văn bản làm cha mẹ?

Do văn bản không thể vừa trên một dòng, chế độ xem văn bản có giả định yêu cầu tất cả chiều rộng có sẵn không? Tôi muốn chế độ xem bị giới hạn bởi các kích thước nhỏ nhất có thể.

Bất kỳ ý tưởng nào?

Để tham khảo, đây là định nghĩa layout:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:singleLine="false" 
    android:textSize="24sp" 
    android:textStyle="bold" 
    android:textColor="@color/white" 
    android:gravity="center_horizontal" 
/> 
+0

Chiều rộng nhỏ nhất có thể sẽ có nhiều khả năng gần như một từ trên mỗi dòng ... Đó có phải là những gì bạn đang cố gắng đạt được không? – BrainCrash

+0

Việc phân tích cú pháp và gói văn bản là tốt, nhưng tôi phải nói thêm màu nền, tôi sẽ thấy rằng chiều rộng của khung nhìn mở rộng đến chiều rộng của bố mẹ, để lại phần đệm ở hai bên của văn bản. Văn bản dòng đơn không làm điều này nhưng một khi văn bản kết thúc tốt đẹp, có vẻ như giả định rằng nó cần tất cả chiều rộng có sẵn. Sau khi phân tích cú pháp, nó sẽ là tốt đẹp để bằng cách nào đó có chuyển tiếp xem và đo lường để bọc nội dung. – Chase

+0

@Chase: Tôi có cùng một vấn đề và câu trả lời ở đây không giải quyết được. Bạn có thể giải quyết nó không? Xem câu hỏi của tôi tại đây tại: http://stackoverflow.com/questions/22970783/correct-textview-padding – oat

Trả lời

38

tôi đã cùng một vấn đề cũng ... Bạn có thể sử dụng TextView tùy chỉnh với phương pháp ghi đè onMeasure(), nơi bạn tính toán chiều rộng:

public class WrapWidthTextView extends TextView { 

... 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    Layout layout = getLayout(); 
    if (layout != null) { 
     int width = (int) Math.ceil(getMaxLineWidth(layout)) 
       + getCompoundPaddingLeft() + getCompoundPaddingRight(); 
     int height = getMeasuredHeight();    
     setMeasuredDimension(width, height); 
    } 
} 

private float getMaxLineWidth(Layout layout) { 
    float max_width = 0.0f; 
    int lines = layout.getLineCount(); 
    for (int i = 0; i < lines; i++) { 
     if (layout.getLineWidth(i) > max_width) { 
      max_width = layout.getLineWidth(i); 
     } 
    } 
    return max_width; 
} 
} 
+0

Điều này sẽ được đánh dấu là câu trả lời. – sidon

+0

Đây hoàn toàn là câu trả lời đúng. Cảm ơn bạn! – Tomasz

+0

@Vitaliy Polchuk: Bạn có thể xem xét một câu hỏi tương tự tại đây tại: http://stackoverflow.com/questions/22970783/correct-textview-padding – oat

0

Một giải pháp tối ưu hóa một chút cho câu trả lời được chấp nhận ở trên:

@Override 
protected void onMeasure(int widthSpec, int heightSpec) { 
    int widthMode = MeasureSpec.getMode(widthSpec); 

    // if wrap_content 
    if (widthMode == MeasureSpec.AT_MOST) { 
     Layout layout = getLayout(); 
     if (layout != null) { 
      int maxWidth = (int) Math.ceil(getMaxLineWidth(layout)) + 
          getCompoundPaddingLeft() + getCompoundPaddingRight(); 
      widthSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST); 
     } 
    } 
    super.onMeasure(widthSpec, heightSpec); 
} 
Các vấn đề liên quan