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