2011-07-22 39 views
60

official documentation似乎無法回答此問題,或者我無法弄清楚。在代碼和資源中設置TextView字體大小時的不一致性

元素(沒關係的AlertDialog,它發生在任何的TextView以及):

TextView tv = (TextView) dialog.findViewById(android.R.id.message); 

不一致性。方案A:

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); 
// or tv.setTextSize(14); does the same 

案例B:

tv.setTextSize(getResources().getDimension(R.dimen.text_size_small)); 
// TypedValue makes no difference either. 

其中values/dimens.xml有它:

<dimen name="text_size_small">14sp</dimen> 

結果:字體大小是不一樣的,而且從資源檢索時會出現更大。我可能錯過了一些東西,那麼我的錯誤是什麼,最重要的是:爲什麼?

- UPDATE先應答 -

的固定數量只是一個例子,因爲沒有人會硬代碼在代碼固定的字體大小。因此,讓我重新說明這個問題:

爲什麼如果我從代碼獲取資源,文本大小比從XML佈局獲取資源時大?此外,問題仍然是一樣的:如何在代碼中檢索14sp單元,並使其與佈局XML中設置的14sp單元保持一致?我沒有接受答案,因爲它沒有告訴我如何從代碼中的資源中使用文本大小的sp單元。

在此佈局,字體大小是不同的,即使尺寸是相同的:

<TextView 
      android:id="@+id/my_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@style/TextBody" /> 

styles.xml:

<style name="TextBody"> 
    <item name="android:textSize">@dimen/text_size_small</item> 
    <item name="android:lineSpacingMultiplier">1.1</item> 
    <item name="android:textColor">@color/body_text_1</item> 
    <item name="android:textIsSelectable">true</item> 
    <item name="android:linksClickable">true</item> 
</style> 

見text_size_small呢?爲什麼在這種情況下字體大小比在代碼中小,使用相同的dimen資源?

+0

謝謝你提出這個問題。我也在我的項目中得到它。 – anticafe

回答

102

的問題,您應該使用setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);因爲getDimension方法的文檔指出它返回一個Resource dimension value multiplied by the appropriate metric.我的理解是預先計算的絕對PX值。

也就是說,使用方法:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small)); 
+0

謝謝。我猜這就是尼古拉試圖說的(現在我明白了),但是你的解釋讓我明白了問題的根源。 – davidcesarino

2

sppxdpi

tv.setTextSize(14) = 14 pixels 
+0

這只是一個例子......我不會在代碼中使用硬編碼單元。我更新了我的問題以澄清。問題是我從相同的資源獲取不一致的字體大小,具體取決於我是在佈局還是在代碼中檢索。這是我想解決的問題。 – davidcesarino

22

不知怎的,這似乎符合:

XML:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="typo14">9sp</dimen> 
</resources> 

的Java:

setTextSize(TypedValue.COMPLEX_UNIT_SP, 9); 
setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.typo14)); 
+1

感謝您的代碼非常直觀地展示瞭解決方案。一般來說,這基本上是maxmc所說的......在從資源中檢索時使用帶像素單元的「setTextSize」。 – davidcesarino

+0

我有一個自定義控件,它的'textSize'使用'sp'設置。當你使用'getDimensionPixelSize'得到這個值時,它會被轉換爲像素。然後,當設置文本大小時,它默認爲'sp'(或其他),所以尺寸太大了。這幫了很多。 – JeffRegan