从XML获取尺寸并在运行时设置文本大小


101

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

这两种设备的大小均正常。

Answers:


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

在代码中设置大小:

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

7
我不了解OP,但这是我一直在寻找的答案。我使用COMPLEX_UNIT_DP时以为我需要指定输入类型而不是输出类型。
HenryAdamsJr

当我获得字体大小(在sp中定义)时,我得到60。当我用OMPLEX_UNIT_PX将其设置回去并再次取回时,我得到70。似乎不是所有的地方都清楚
Gleichmut

2
对于文本大小,为什么不能使用它TypedValue.COMPLEX_UNIT_SP呢?
dphans 18-10-24

3
@dphans该Resources.getDimension()方法返回已乘以适当指标的值
pkuszewski

2
@pkuszewski哇,真是令人困惑。
Big_Chair19年

4

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

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

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

最好的方法是在电话的values文件夹中创建两个dimens.xml文件,在平板电脑的values-sw600dp文件中创建另一个dimens.xml文件(您也可以使用values-sw720dp-land文件夹在横向放置10英寸平板电脑的尺寸)。

您可以在以下网址了解有关Android中尺寸的更多信息:http : //android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.