官方文档似乎没有回答这个问题,或者我想不通。
元素(别管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
资源,字体大小比代码中的要小?
您应该使用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