official documentation似乎没有回答这个问题,或者我无法理解。
元素(不管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
资源?
答案 0 :(得分: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));
答案 1 :(得分:23)
不知怎的,这似乎很合适:
XML:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="typo14">9sp</dimen>
</resources>
爪哇:
setTextSize(TypedValue.COMPLEX_UNIT_SP, 9);
setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.typo14));
答案 2 :(得分:2)
这是sp
px
dpi
tv.setTextSize(14) = 14 pixels