64

官方文档似乎没有回答这个问题,或者我想不通。

元素(没关系AlertDialog,它也发生在任何 TextView 上):

TextView tv = (TextView) dialog.findViewById(android.R.id.message);

不一致。案例一:

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" />

样式.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资源?

4

3 回答 3

107

您应该使用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));
于 2011-08-13T18:03:55.977 回答
25

不知何故,这似乎适合:

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));
于 2012-02-20T14:12:16.860 回答
2

这是一个问题sp px dpi

tv.setTextSize(14) = 14 pixels 
于 2011-07-22T00:18:19.373 回答