2011-07-22 86 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