如何在Android中使用dimens.xml?

如何在Android中使用dimens.xml?,android,android-layout,Android,Android Layout,在设计布局时,由于涉及可维护性的主题,我将所有维度集中在dimens.xml中。我的问题是这是否正确。最好的做法是什么?这方面的信息很少,什么都没有。我知道最好将布局的所有字符串集中在strings.xml上,将colors集中在colors.xml上。但是关于维度呢 例如: <TableLayout android:id="@+id/history_detail_rows_submitted" android:layout_width="match_parent"

在设计布局时,由于涉及可维护性的主题,我将所有维度集中在dimens.xml中。我的问题是这是否正确。最好的做法是什么?这方面的信息很少,什么都没有。我知道最好将布局的所有字符串集中在strings.xml上,将colors集中在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" />

根据官方Android文档,“维度是一种简单资源,使用
名称
属性中提供的值(而不是XML文件的名称)进行引用。因此,您可以将维度资源与一个XML文件中的其他简单资源组合在一个
元素下”

有关更多详细信息,请参阅


在这篇文章中,Devunwired给出了使用dimens.xml的三个重要原因。添加一个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>
也可以在其他布局(xml文件)中使用


@卡斯特罗你做得对。在dimens.xml文件中维护值比在所有布局文件中乱扔硬编码值要好

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

您不需要在value文件夹文件中提及dimen值。这个库可以自动管理所有你这样称呼的东西

<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"
 >

如何使用
dimens.xml
  • 右键单击
    values
    文件夹并选择new>values资源文件,创建一个新的
    dimens.xml
    文件。为名称写入
    dimens
    。(您也可以将其称为
    dimen
    dimensions
    。名称实际上并不重要,只是它将包含的
    dimen
    资源类型。)

  • 添加一个
    dimen
    名称和值

     <?xml version="1.0" encoding="utf-8"?>
     <resources>
         <dimen name="my_value">16dp</dimen>
     </resources>
    
    还是用代码

     float sizeInPixels = getResources().getDimension(R.dimen.my_value);
    
  • 何时使用
    dimens.xml
    感谢您提供更多的想法

  • 重用值-如果您需要在整个应用程序中使用同一维度的多个位置(例如,活动布局填充或文本视图
    textSize
    ),则使用单个
    dimen
    值将使以后的调整更加容易。这与使用样式和主题的想法相同

  • 支持多屏幕-在手机上填充
    8dp
    可能看起来不错,但在10“平板电脑。您可以创建多个
    dimens.xml
    ,用于不同的屏幕。这样你就可以为手机设置
    8dp
    ,为平板电脑设置
    64dp
    。要创建另一个
    dimens.xml
    文件,请右键单击您的
    res
    文件夹,然后选择New>Value-resource-file。(详情请参阅)

  • 方便的
    dp
    px
    代码转换
    -在代码中,通常需要使用像素值。但是,您仍然必须考虑设备密度,并且以编程方式执行此操作非常烦人。如果你有一个常量
    dp
    值,你可以很容易地用
    float
    得到它:

     float sizeInPixels = getResources().getDimension(R.dimen.my_value);
    
    或者对于
    int

     int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_value);
    
  • 我将在中提供更多关于如何做这些事情的细节

    何时不使用
    dimens.xml
    • 如果要使值更难维护,请不要将值放入
      dimens.xml
      。通常情况下,只要它不属于我上面列出的类别,就会出现这种情况。使用
      dimens.xml
      会使代码更难阅读,因为您必须在两个文件之间来回翻转才能查看实际值。(在我看来)个人观点是不值得的

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


      • 我使用了一种新颖的方法,我认为这种方法符合这个问题。我一直在避免使用Xml,以避免解析Xml代码的成本

        我使用java常量,而不是使用xml维度。 要么

        public interface DimenConstants { ... }
        
        或者

        然后,在支持不同屏幕的情况下,您可以在运行时自己在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;
            }
        }
        

        我的问题是这是否正确
        。是的。在dimens.xml中保留维度是正确的方法。但有时候太复杂了。我通常在dimen.xml中只保留那些我将根据不同屏幕大小更改的维度,或者为不同视图(默认填充、文本大小)共享的维度。我同意@VolodymyrBaydalka。毫无疑问,使用超高度集中的方法维护dimens.xml是非常困难的。管理每个视图的文本大小很好。谢谢。但是,我想知道哪种方法更适合管理或维护dimens.xml文件。您如何确定将来不使用哪个值?!这不是很难,甚至是不可能的。我认为现在的假设是做出最好的猜测,如果将来其他地方需要该值,那么您可以在那时将其提取到dimens文件中。很好的概述。谢谢
         float sizeInPixels = getResources().getDimension(R.dimen.my_value);
        
         int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_value);
        
        public interface DimenConstants { ... }
        
        public class DimenConstants
        {
            public static void init(Activity activity){...}
        }
        
        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;
            }
        }