从XML获取维度并在运行时设置文本大小

时间:2013-01-26 18:45:29

标签: android

在dimens.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)

两台设备的尺寸均正常。

4 个答案:

答案 0 :(得分:263)

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

在代码中设置大小:

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

答案 1 :(得分:3)

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

您的平板电脑密度似乎是mdpi(160dpi),因此比例仅为1:1。

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

最好的方法是在手机的值文件夹中创建两个dimens.xml文件,在平板电脑的值 - sw600dp中创建另一个(您还可以使用值-sw720dp-land文件夹以横向方向存储10英寸平板电脑的尺寸)。

您可以在以下位置详细了解Android中的维度:http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/

答案 2 :(得分:1)

您可以使用sdp(可扩展的密度像素)https://github.com/intuit/sdp代替dp,这肯定会挽救您的生命

答案 3 :(得分:0)

为了扩展 Kostek 波兰的回答,

您的文字大小未按预期显示的原因是因为在这一行中:

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

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

textView.setTextSize(size)

该方法将您的文字大小设置为 23sp,因此您的文字大小会比预期的要大。

解决方案是在设置文本大小时改用这一行:

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

这是可行的,因为第一个参数声明第二个参数是像素类型。所以现在如果第二个参数是 23,那么它不会被当作 23sp 对待,而是表示 23 像素,相当于 18sp,但以像素为单位。