在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)
两台设备的尺寸均正常。
答案 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,但以像素为单位。