在代码和资源中设置 TextView 字体大小时不一致

发布于 2024-11-25 07:41:33 字数 1790 浏览 4 评论 0原文

官方文档似乎没有回答这个问题,或者我无法弄清楚它出来了。

元素(别介意 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 资源,字体大小比代码中的小?

The official documentation does not seem to answer this, or I can't figure it out.

Element (nevermind the AlertDialog, it happens on any TextView as well):

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

Inconsistency. Case A:

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
// or tv.setTextSize(14); does the same

Case B:

tv.setTextSize(getResources().getDimension(R.dimen.text_size_small));
// TypedValue makes no difference either.

where values/dimens.xml has it:

<dimen name="text_size_small">14sp</dimen>

Result: font size is not the same, and appears much bigger when retrieving from resource. I'm probably missing something, so what's my mistake, and the most important: why?

-- UPDATE TO FIRST ANSWER --

The fixed number was just an example, as nobody would hard code fixed font sizes in code. So let me rephrase the question:

Why if I get the resource from code, the text size is bigger than when I get the resource from a XML layout? Besides, the question is still the same: how do I retrieve a 14sp unit in code and keep it consistent with the 14sp unit that is set in the layout XML? I did not accept the answer because it does not tell me how to use sp units from resource in code for text size.

On this layout, the font size is different, even if the dimension is the same:

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

See text_size_small there? Why in this case the font size is smaller than in the code, using the same dimen resource?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半世蒼涼 2024-12-02 07:41:33

您应该使用 setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);,因为 getDimension 方法的文档指出它返回一个资源维度值乘以适当的指标。 我理解为预先计算的绝对 px 值。

也就是说,使用:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small));

You should use setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); because the documentation of the getDimension method states that it returns a Resource dimension value multiplied by the appropriate metric. which I understand to be the precalculated absolute px value.

That is, use:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small));
╰つ倒转 2024-12-02 07:41:33

不知怎的,这似乎很合适:

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

Somehow this seems to fit:

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));
圈圈圆圆圈圈 2024-12-02 07:41:33

这是 sp px dpi 的问题

tv.setTextSize(14) = 14 pixels 

Its a matter of sp px dpi

tv.setTextSize(14) = 14 pixels 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文