补充答案
@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 并选择Smallest Screen Width。输入 600 作为宽度(7 英寸平板电脑)。 (还有其他选择尺寸的方法。请参阅documentation 和this answer 了解更多信息。)
这将创建另一个values 文件夹,用于最小屏幕宽度为600dp 的设备。在 Android 视图中,两个dimens.xml 文件如下所示。
现在您可以独立修改它们了。
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 之间以编程方式扩展的痛苦(请参阅this answer 了解如何)。
如果你已经在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);
无论用户拥有什么密度设备,它都已经转换为像素。