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

Ric*_*ral 18 android dimensions android-layout

例如,在特定的布局中,我有以下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" />
Run Code Online (Sandbox Code Playgroud)

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

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

Dev*_*red 30

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

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

HTH!


Sur*_*gch 14

补充答案

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

1.重复使用

如果你像这样设置一些dpspdimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textview_padding">16dp</dimen>
    <dimen name="large_text_size">30sp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)

您可以在多个位置的整个应用中重复使用它.

<TextView
    android:padding="@dimen/textview_padding"
    android:textSize="@dimen/large_text_size"
    ... />

<TextView
    android:padding="@dimen/textview_padding"
    android:textSize="@dimen/large_text_size"
    ... />
Run Code Online (Sandbox Code Playgroud)

然后,当您需要进行更改时,您只需要在一个地方进行更改.

笔记

  • 这与使用样式或主题的效果基本相同.
  • dimen如果它们真的不应该,请注意不要给两个不同的视图相同的值.如果您需要更改一组视图而不是另一组视图,那么您将不得不单独返回每个视图,这会使目的失败.

2.尺寸差异

  • @Devunwired称这种密度差异,但如果你使用dp(密度无关的像素),这已经很小心了除了最小的情况之外的所有密度差异问题.所以在我看来,屏幕尺寸是一个更重要的使用因素dimens.xml.

一个8dp填充可能会在手机上很好看,但是当应用程序的平板电脑上运行,它看起来过于狭窄.您可以通过制作两个(或更多)不同版本来解决此问题dimens.xml.

右键单击您的res文件夹,然后选择新建>值资源文件.然后写入dimens并选择最小屏幕宽度.写入宽度为600(7"平板电脑).(还有其他方法可以选择尺寸.有关详细信息,请参阅文档此答案.)

在此输入图像描述

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

在此输入图像描述

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

值/ dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="my_default_padding">16dp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)

值-sw600dp/dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="my_default_padding">64dp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)

使用时,您dimen只需使用两个dimens.xml文件中使用的名称进行设置.

<LinearLayout
    ...
    android:padding="@dimen/my_default_padding">

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

系统将根据用户使用的设备自动为您选择正确的值.

3.从代码中读入

有时,它是一种痛苦之间编程比例pxdp(见这个答案如何).

如果您dp已经定义了dimens.xml这样的固定值

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="my_dp_value">16dp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后你可以很容易地得到它

int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_dp_value);
Run Code Online (Sandbox Code Playgroud)

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


Sag*_*kar 5

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

现在,尽管您可能不会立即重复使用这些值,但是将它们放在dimens.xml将来以供参考仍然是一个好主意。此外,遵循标准的Android编程范例可帮助其他开发人员更快地理解您的代码。这很像strings.xml我们放置的位置String,其中一些最终仅使用一次!:)

  • 事情不是完全一样,字符串XML文件还允许国际化,因此将它们与代码分开更有意义。 (2认同)