如何在运行时以编程方式使用 xml 中的维度设置文本大小?

Xml 中,我有:

<dimen name="text_medium">18sp</dimen>

在运行时,我得到这个值并设置文本视图的文本大小:

int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium);
textView.setTextSize(size).

在10英寸的平板电脑(1280 x 800)上,一切正常; 但在手机(800 x 480)上,文本视图的字体非常大。在平板电脑上,大小等于18; 在手机上,大小等于27。

如果手动设置大小:

textView.setTextSize(size)

两个设备的尺寸都是正常的。

68996 次浏览

dimens.xml中增加维度:

   <dimen name="text_medium">18sp</dimen>

用代码设置大小:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));

这两种方法都使用屏幕密度来计算像素。您的手机屏幕密度显然是 hdpi (240dpi) ,因此它使用1.5比例尺来转换 dp 为 sp。简单数学18 * 1.5 = 27。

It seems that your tablet density is mdpi (160dpi) so scale is just 1:1.

但是如果你比较两个文本的实际大小,它应该是相同的。

The best way is just create two dimens.xml files one in values folder for phone, and another in values-sw600dp for tablets (you could use also values-sw720dp-land folder to store dimensions for 10 inch tablets in landscape orientation).

你可以在 http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/阅读更多关于 Android 的尺寸信息

你可以用 sdp (可伸缩密度像素) https://github.com/intuit/sdp代替 dp,这绝对会挽救你的生命

为了详细说明波兰 Kostek 公司的答案,

文本大小不如预期的原因是:

int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium);

GetVersionPixelSize () 将“18sp”转换为像素大小,因此返回的值与18不同。例如,该方法返回一个值23。因此,当执行这一行时:

textView.setTextSize(size)

该方法将文本大小设置为23sp,因此文本大小将显示大于预期。

The Solution is to use this line instead when setting your text size:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));

这是因为第一个参数指出第二个参数的类型是像素。所以现在如果第二个参数是23,那么它不会被当作是23sp,而是意味着23像素,相当于18sp,但以像素为单位。