在代码和资源中设置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> 

结果:字体大小不一样,从资源检索时显得大得多。 我可能错过了一些东西,那么我的错误是什么,最重要的是:为什么?

更新到第一个答案

固定的数字只是一个例子,因为没有人会在代码中硬编码固定的字体大小。 所以让我重新说一下这个问题:

为什么如果我从代码获取资源,文本大小比从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 ,使用相同的dimen资源?

你应该使用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)); 

不知何故,这似乎适合:

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)); 

它是一个sp px dpi

 tv.setTextSize(14) = 14 pixels