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

问题描述 投票:18回答:3

例如,在特定布局中,我具有以下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文件中吗?

android android-layout dimensions
3个回答
32
投票

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

  1. Reuse:我需要多个小部件或布局来使用相同的值,并且只希望在更新或调整应用程序时对其进行一次更改。

  2. 密度差:如果我需要使尺寸比ldpi -> hdpismall -> large稍小或更大。

  3. 从代码中读取:当我在代码中实例化视图并想应用一些静态尺寸时,将它们作为dimens.xml(或dp)放在dip中,以便使用Resources.getDimensionPixelSize()在Java代码中获得标度值。


15
投票

补充答案

@ 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"
    ... />

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

Notes

  • 这基本上与使用样式或主题相同。
  • 如果确实不应该给两个不同的视图相同的dimen值,请注意。如果您需要更改一组视图而不是其他视图,那么您将不得不单独返回每一个视图,这违背了目的。
  • 2。尺寸差异

  • @@ Devunwired称为此[[Density Difference,但是如果您使用dp(与密度无关的像素),则已经解决了除最少数情况以外的所有情况下的密度差异问题。因此,在我看来,屏幕尺寸是使用dimens.xml的一个更重要的因素。
  • 8dp填充在手机上看起来不错,但是当应用在平板电脑上运行时,它看起来太窄了。您可以通过制作两个(或更多)不同的dimens.xml版本来解决此问题。

右键单击res文件夹,然后选择

新建>值资源文件

。然后输入dimens并选择最小屏幕宽度。在600中输入宽度(7英寸平板电脑)。 (还有其他选择大小的方法。有关更多信息,请参见documentationthis answer。)enter image description here

这将创建另一个values文件夹,该文件夹将用于最小屏幕宽度为600dp的设备。在Android视图中,两个dimens.xml文件如下所示。

enter image description here

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

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

有时是通过编程在pxdp之间进行缩放的痛苦(有​​关方法,请参见this answer

如果您已经在dp中定义了固定的dimens.xml值,则像这样

<?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文件用于将所有硬编码像素值保留在一个位置。

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


5
投票
dimens.xml文件用于将所有硬编码像素值保留在一个位置。
© www.soinside.com 2019 - 2024. All rights reserved.