如何在Android中使用dimens.xml?

时间:2015-03-18 16:58:57

标签: 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" />

6 个答案:

答案 0 :(得分:49)

如何使用dimens.xml

  1. 通过右键单击dimens.xml文件夹并选择新建&gt;来创建新的values文件值资源文件。为名称写dimens。 (您也可以将其称为dimendimensions。名称并不重要,只包含它将包含的dimen资源类型。)

  2. 添加dimen名称和值。

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

    值可以在dppxsp中。

  3. 使用xml中的值

    <TextView
        android:padding="@dimen/my_value"
        ... />
    

    或代码

    float sizeInPixels = getResources().getDimension(R.dimen.my_value);
    
  4. 何时使用dimens.xml

    感谢this answer提供了更多想法。

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

    2. 支持多个屏幕 - 8dp的填充可能在手机上看起来不错,但在10&#34;片剂。您可以创建多个dimens.xml以用于不同的屏幕。这样你可以为手机设置8dp,为平板电脑设置64dp。要创建另一个dimens.xml文件,请右键单击您的res文件夹,然后选择新建&gt;价值资源文件。 (有关详细信息,请参阅this answer

    3. 方便的dppx代码转换 - 在代码中,您通常需要使用像素值。但是你仍然需要考虑设备密度,而conversion很难以编程方式进行。如果您有一个dp的常量值,则可以像float这样容易得到像素:

      float sizeInPixels = getResources().getDimension(R.dimen.my_value);
      

      int

      int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_value);
      
    4. 我在my fuller answer中提供了有关如何执行这些操作的更多详细信息。

      何时不使用dimens.xml

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

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

答案 1 :(得分:2)

添加一个xml文件dimens.xml,用于支持多个设备。

 <resources>
 <!-- Default screen margins, per the Android Design guidelines. -->
  <dimen name="iconarrow">1dp</dimen>
  <item name="text_view_padding" type="integer">100</item>
</resources>

然后你可以在你的代码中使用它,就像在java代码中一样

textview.setPadding(0, 0, 0, getResources().getInteger(R.integer.text_view_padding));

您也可以在其他布局(xml文件)中使用。

android:padding="@dimen/text_view_padding"

答案 2 :(得分:0)

But about dimensions?

根据官方Android文档&#34;维度是使用name属性(而不是XML文件的名称)中提供的值引用的简单资源。因此,您可以将维度资源与一个XML文件中的其他简单资源组合在一个<resources>元素下#34;

有关详细信息,请参阅http://developer.android.com/guide/topics/resources/more-resources.html

在这篇文章中,Devunwired提出了三个很好的理由,为什么要使用dimens.xml When should the dimens.xml file be used in Android?

答案 3 :(得分:0)

@JesúsCastro你做得对。维护dimens.xml文件中的值比在所有布局文件中乱丢硬编码值更好。

例如,假设您在所有视图中增加左右边距的情况。如果您使用了dimens.xml中维护的单个值,则这将是一个快速更改 - 单个文件中的单个值。 但是,如果您将边距值作为文字值(例如“16dp”)放在布局文件中(而不是使用像“@ dimen / leftright_margin”这样的维度值),则必须编辑容易出错的每个布局文件而且很简单。

答案 4 :(得分:0)

您不需要在值文件夹文件中提及维度值。这个库自动管理你刚刚调用的所有东西

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/_20sdp"
android:paddingLeft="@dimen/_20sdp"
android:paddingRight="@dimen/_20sdp"
android:paddingTop="@dimen/_20sdp"
android:background="@color/colorPrimary"
android:orientation="vertical"
 >

whole code click here for that

答案 5 :(得分:0)

我有一种新颖的方法,我认为与问题相符。我一直在尽量避免使用Xml来避免解析xml代码的开销。

我使用java常量而不是使用xml dimens。 要么...

public interface DimenConstants { ... }

或...

public class DimenConstants
{
    public static void init(Activity activity){...}
}

然后,在支持其他屏幕的情况下,您实际上可以在运行时使用Java自己完成此操作。一种方法是:

public class TestScreenSizes extends Activity
{
    public static final ViewGroup.LayoutParams MAIN_VIEW_SPEC = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);

    @Override protected void onCreate(Bundle savedState)
    {
     super.onCreate(savedState);
     setContentView(newTextView(),MAIN_VIEW_SPEC);
    }

    protected TextView newTextView()
    {
     TextView tv = new TextView(this);
     DisplayMetrics display = getResources().getDisplayMetrics();

     int resolution = display.widthPixels * display.heightPixels;

     if(resolution == 1024) tv.setText("You are using an iphone");
     else if(resolution == 4096) tv.setText("You are using a Samsung Galexy");

     return rv;
    }
}