何时应该在Android中使用dimens.xml文件?

时间:2011-09-22 01:16:40

标签: android android-layout dimensions

例如,在特定的布局中,我有以下XML:

<GridView
    android:id="@+id/gridView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="3dp"
    android:columnWidth="48dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="spacingWidth" />

此网格视图特定于此布局,我认为我不会使用具有类似属性的任何其他网格视图。这就是说代码中的维度值特定于该网格视图。

我是否应该将它们移动到dimens.xml文件中,或者将它们留下来就可以了?如果是这样,只有在多个布局中使用该值时,我才应该在dimens.xml文件中放置值吗?

3 个答案:

答案 0 :(得分:27)

我将维度值放入dimens.xml资源通常有三个原因:

  1. 重用:我需要多个小部件或布局才能使用相同的值,我只想在整个应用程序中更新或调整时更改一次
  2. 密度差异:如果我需要从ldpi稍微更小或更大的尺寸 - > hdpi或small - &gt;大
  3. 从代码中读取:当我在代码中实例化一个视图并想要应用一些静态维度时,将它们放在dimens.xml中作为“dp”或“dip”允许我在Java中获得一个缩放值代码Resources.getDimensionPixelSize()
  4. HTH!

答案 1 :(得分:8)

补充答案

@Devunwired列出了使用dimens.xml的3个理由。以下是如何执行此操作的详细信息。

1。重用

如果您在dp中设置一次spdimens.xml

<?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文件夹,然后选择新建&gt;价值资源文件。然后写入dimens并选择最小屏幕宽度。用 600 写宽度(7“平板电脑)。 (还有其他选择尺寸的方法。有关详情,请参阅documentationthis answer。)

enter image description here

这将生成另一个values文件夹,该文件夹将用于屏幕宽度最小为600dp的设备。在Android视图中,两个dimens.xml文件看起来像这样。

enter image description here

现在您可以单独修改它们。

值/ dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="my_default_padding">16dp</dimen>
</resources>

值-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。从代码中读入

有时在pxdp之间以编程方式进行痛苦缩放(请参阅this answer了解如何)。

如果您已在此{/ 1}}中定义了固定的dp

dimens.xml

然后你可以轻松搞定

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="my_dp_value">16dp</dimen>
</resources>

并且它已经被转换为用户拥有的任何密度设备的像素。

答案 2 :(得分:3)

dimens.xml文件用于将所有硬编码像素值保存在一个位置。

现在,虽然您现在可能不会重复使用这些值,但仍然可以将它们放在dimens.xml中以供将来参考。此外,遵循标准Android编程范例可帮助其他开发人员更快地理解您的代码。这与我们放置strings.xml的{​​{1}}非常相似,其中一些最终仅被使用一次! :)