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