2011-08-31 20 views
10

Tôi không tin điều này tồn tại, nhưng muốn kiểm tra lại. Tôi muốn thiết lập kích thước văn bản của TextView sao cho nó vừa với một chiều rộng nhất định, một dòng. Ví dụ:Văn bản tỷ lệ trong một chế độ xem vừa với vừa?

<LinearLayout 
    layout_width="100dip" 
    layout_height="50dip"> 

    <TextView 
    layout_width="fill_parent" 
    layout_height="wrap_content" 
    textSize="fill" 
    text="fit me please!" /> 

</LinearLayout> 

Cảm ơn

Trả lời

11

Bạn có thể sử dụng TextUtils.EllipsizeCallback. Khi văn bản được bỏ qua, việc gọi lại này được thực hiện bằng cách xem văn bản. Ở đây bạn có thể đặt kích thước văn bản nhỏ hơn kích thước hiện tại.

EDIT: Nếu không, bạn có thể sử dụng cách này TextUtils.ellipsize

while (mText != TextUtils.ellipsize(mText, textPaint, other params)) { 
    textpaint.setTextSize(textpaint.getTextSize() - 1); 
} 
+0

Thú vị nhất! – user291701

+1

Hãy cẩn thận .. Đây là ý tưởng đúng, nhưng getTextSize() trả về PX và setTextSize() mất DIP. Bạn sẽ không muốn ăn một cái khác. Theo dõi kích thước trong một biến độc lập .. –

+1

Tôi đang thiết lập văn bản cho đối tượng vẽ không phải là dạng xem văn bản. Khi tôi tìm thấy kích thước phù hợp, chỉ sau đó tôi đặt nó vào chế độ xem văn bản. Vì vậy, tôi thấy không có vấn đề trong việc sử dụng ý tưởng này. – Ronnie

0

Bạn luôn có thể kết hợp các định nghĩa layout xml với java và tự động xác định kích thước của văn bản. Có thể bạn sẽ cần một số tính toán và tham chiếu từ các đơn vị nhúng đến thông tin mật độ pixel về màn hình hiện tại đang sử dụng, nhưng một khi đã hoàn thành, nó hầu như đảm bảo giải quyết vấn đề của bạn cho mọi trường hợp.

+0

Xin chào, tôi đã viết một cái gì đó để làm điều này (đó là một chút xấu xí) đã được hy vọng phiên bản mới hơn của SDK có thể đã thêm một lá cờ mới để làm điều tương tự. – user291701

4

chức năng tùy chỉnh này nên làm điều đó, sử dụng TextUtils.ellipsize ...

public static void shrinkTextToFit(float availableWidth, TextView textView, 
            float startingTextSize, float minimumTextSize) { 

    CharSequence text = textView.getText(); 
    float textSize = startingTextSize; 
    textView.setTextSize(startingTextSize); 
    while (text != (TextUtils.ellipsize(text, textView.getPaint(), 
             availableWidth, TextUtils.TruncateAt.END))) { 
     textSize -= 1; 
     if (textSize < minimumTextSize) { 
      break; 
     } else { 
      textView.setTextSize(textSize); 
     } 
    } 
} 
+0

Tôi đang sử dụng phương pháp này và tôi 'm nhận 'java.lang.StackOverflowError' trong các thiết bị này: GT-I9192, D5803, với API 4.2.2, 4.4.4 – GuilhE

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