补充回答
@Devunwired列举了使用dimens.xml
的3个原因。以下是如何实现这些细节。
1. 重用
如果你在dimens.xml
中设置一些dp
或sp
值,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textview_padding">16dp</dimen>
<dimen name="large_text_size">30sp</dimen>
</resources>
你可以在应用程序的多个地方重复使用它。
<TextView
android:padding="@dimen/textview_padding"
android:textSize="@dimen/large_text_size"
... />
<TextView
android:padding="@dimen/textview_padding"
android:textSize="@dimen/large_text_size"
... />
当您需要进行更改时,只需要在一个地方进行即可。
注释
- 这基本上与使用样式或主题的效果相同。
- 如果您不小心给两个不应该有相同
dimen
值的视图赋予了相同的值,那么如果您需要对其中一组视图进行更改而不对另一组视图进行更改,则必须逐个返回每个视图,这将破坏其目的。
2. 大小差异
- @ Devunwired 称此为密度差异,但如果您使用
dp
(密度无关像素),则除最小情况外,它已经解决了所有密度差异问题。因此,在我看来,屏幕大小是使用dimens.xml
的更重要因素。
8dp
填充在手机上可能看起来很好,但在平板电脑上运行应用程序时,它看起来太窄了。您可以通过制作两个(或更多)不同版本的dimens.xml
来解决此问题。
右键单击您的res
文件夹,选择新建>值资源文件。然后输入dimens
并选择最小屏幕宽度。键入宽度的值600(7英寸平板电脑)。 (有其他选择大小的方法。请参见文档和此答案以获取更多信息。)
![enter image description here](https://istack.dev59.com/cjclo.webp)
这将创建另一个values
文件夹,该文件夹将用于其最小屏幕宽度为600dp
的设备。在Android视图中,这两个dimens.xml
文件如下所示。
![enter image description here](https://istack.dev59.com/zTy1o.webp)
现在您可以独立修改它们。
values/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_default_padding">16dp</dimen>
</resources>
values-sw600dp/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_default_padding">64dp</dimen>
</resources>
使用 dimen
时,您只需使用在两个 dimens.xml
文件中使用的名称设置即可。
<LinearLayout
...
android:padding="@dimen/my_default_padding">
</LinearLayout>
系统将根据用户使用的设备自动为您选择正确的值。
3. 从代码读取
有时在px
和dp
之间进行程序化缩放可能很麻烦(请参见此答案)。
如果您已经在dimens.xml
中定义了一个固定的dp
值,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_dp_value">16dp</dimen>
</resources>
然后您可以轻松获取它,只需要
int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_dp_value);
并且它将已经转换为像素,以适应用户所使用的任何密度设备。
dimens.xml
文件中如何进行区分(如果可能,请提供示例)?第三个原因非常有说服力。 - rfgamaralres/values
中放置一个dimens.xml
用于默认值,另一个在res/values-ldpi
中包含我想要覆盖低密度设备的一些内容。 - devunwired