如何在Android中使用dimens.xml?

Jes*_*tro 33 android android-layout

当我设计布局时,由于可维护性的主题,我集中了dimens.xml中的所有维度.我的问题是,这是否正确.什么是最好的做法?关于此的信息非常少,没什么.我知道在strings.xml上集中布局的所有字符串,colors.xml上的颜色是个好主意.但关于尺寸?

例如:

<TableLayout
    android:id="@+id/history_detail_rows_submitted"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/cebroker_history_detail_rows_border"
    android:collapseColumns="*">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/history_detail_rows_margin_vertical"
        android:background="@color/cebroker_history_detail_rows_background"
        android:gravity="center"
        android:paddingBottom="@dimen/history_detail_rows_padding_vertical"
        android:paddingLeft="@dimen/history_detail_rows_padding_horizontal"
        android:paddingRight="@dimen/history_detail_rows_padding_horizontal"
        android:paddingTop="@dimen/history_detail_rows_padding_vertical">

        <TextView
            android:layout_width="match_parent"
            android:drawableLeft="@mipmap/ic_history_detail_submitted_by"
            android:drawablePadding="@dimen/history_detail_rows_textviews_padding_drawable"
            android:gravity="left|center"
            android:paddingRight="@dimen/history_detail_rows_textviews_padding"
            android:text="@string/history_detail_textview_submitted_by"
            android:textColor="@color/cebroker_history_detail_rows_textviews"
            android:textSize="@dimen/history_detail_rows_textviews_text_size" />
Run Code Online (Sandbox Code Playgroud)

Sur*_*gch 66

如何使用 dimens.xml

  1. dimens.xml通过右键单击values文件夹并选择" 新建">"值资源文件"来创建新文件.写下dimens名字.(你也可以称它为dimendimensions该名称并不重要,只有dimen资源类型,这将包括.)

  2. 添加dimen名称和值.

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

    值可以是dp,pxsp.

  3. 使用xml中的值

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

    或者在代码中

    float sizeInPixels = getResources().getDimension(R.dimen.my_value);
    
    Run Code Online (Sandbox Code Playgroud)

何时使用 dimens.xml

感谢这个答案提供更多想法.

  1. 重用值 - 如果您需要在整个应用程序中使用相同的维度多个位置(例如,活动布局填充或TextView textSize),那么使用单个dimen值将使以后更容易调整.这与使用样式和主题的想法相同.

  2. 支持多个屏幕 - 8dp在手机上可能看起来不错,但在10英寸平板电脑上看起来很糟糕.你可以创建多个dimens.xml用于不同屏幕.这样你可以做一些像8dp手机和64dp平板电脑的设置.创建另一个dimens.xml文件,右键单击您的res文件夹,然后选择新建>值资源文件.(有关详细信息,请参阅此答案)

  3. 方便dppx代码转换 -在代码中,你通常需要的像素值来工作.但是,你仍然需要考虑设备密度,并且转换很麻烦,以编程方式.如果你有一个常dp数值,你可以像这样容易得到像素float:

    float sizeInPixels = getResources().getDimension(R.dimen.my_value);
    
    Run Code Online (Sandbox Code Playgroud)

    或者这个int:

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

我在更全面的答案中提供了更多关于如何做这些事情的细节.

什么时候不用 dimens.xml

  • dimens.xml如果要使它们更难以维护,请不要将您的值放入其中.通常情况下,只要它不属于我上面列出的类别.使用dimens.xml会使代码更难阅读,因为您必须在两个文件之间来回切换以查看实际值是什么.个人观点不值得(在我看来).

  • 字符串是不同的.所有字符串都应该放在资源文件中,strings.xml因为在国际化应用程序时几乎所有字符串都需要翻译.另一方面,大多数维度值不需要针对不同的位置进行更改.Android Studio似乎支持这种推理.直接在布局xml中定义字符串将发出警告,但dp不会定义值.