2011-08-31 77 views
10

我不相信這一點的存在,但要仔細檢查。我想設置一個TextView的文本大小,使它適合一個給定的寬度,單行。例如:在視圖中縮放文本以適合?

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

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

</LinearLayout> 

感謝

回答

11

可以使用TextUtils.EllipsizeCallback。當文本被省略時,這個回調由textview完成。在這裏您可以設置小於當前的文字大小。

編輯:否則,你可以使用TextUtils.ellipsize這樣

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

有趣的一個! – user291701

+1

小心。這是正確的想法,但getTextSize()返回PX和setTextSize()採用DIP。你不想喂一個到另一個。跟蹤大小的獨立變量.. –

+1

我的TEXTSIZE到噴漆的對象設定不TextView的。當我找到合適的尺寸時,纔將其設置爲textview。所以我認爲使用這個想法沒有問題。 – Ronnie

0

您可以隨時在XML佈局定義與Java相結合,動態地定義文本的大小。你可能會需要從浸單位一些計算和引用有關當前使用的屏幕像素密度的信息,但一旦完成,它應該幾乎可以保證解決你的問題的所有情況。

+0

嗨呀,我寫的東西要做到這一點(這是一個有點難看)希望較新版本的SDK可能會添加一個新標誌來執行相同的操作。 – user291701

4

這個自定義函數應該這樣做,用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

我正在使用這種方法,我在這些設備中獲得java.lang.StackOverflowError':GT-I9192,D5803,API 4.2.2,4.4.4 – GuilhE