[英]How to define dimens.xml for every different screen size in android?
[英]How to use dimens.xml in Android?
当我设计布局时,出于可维护性的考虑,我将所有维度集中在 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" />
dimens.xml
通过右键单击values
文件夹并选择新建 > 值资源文件来创建一个新的dimens.xml
文件。 写下名称的dimens
。 (您也可以将其称为dimen
或dimensions
。名称并不重要,只有它将包含的dimen
资源类型。)
添加dimen
名称和值。
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="my_value">16dp</dimen> </resources>
值可以是dp
、 px
或sp
。
使用 xml 中的值
<TextView android:padding="@dimen/my_value" ... />
或在代码中
float sizeInPixels = getResources().getDimension(R.dimen.my_value);
dimens.xml
感谢这个答案提供更多想法。
重用值- 如果您需要在整个应用程序中的多个位置使用相同的维度(例如,Activity 布局填充或 TextView textSize
),那么使用单个dimen
值将使以后更容易调整。 这与使用样式和主题的想法相同。
支持多屏幕- 8dp
的内边距在手机上可能看起来不错,但在 10" 平板电脑上可能很糟糕。您可以创建多个dimens.xml
以用于不同的屏幕。这样您就可8dp
手机设置8dp
和64dp
用于平板电脑。要创建另一个dimens.xml
文件,请右键单击您的res
文件夹并选择“新建”>“值资源文件” 。(有关详细信息,请参阅此答案)
方便的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 文件 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"
您不需要在值文件夹文件中提及维度值。 这个库会自动管理你刚才调用的所有东西
<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"
>
But about dimensions?
根据Android官方文档“维度是使用name
属性中提供的值(而不是XML文件的名称)引用的简单资源。因此,您可以将维度资源与一个XML中的其他简单资源结合起来文件,在一个<resources>
元素下”
有关更多详细信息,请参阅http://developer.android.com/guide/topics/resources/more-resources.html
在这篇文章中,Devunwired 给出了为什么使用 dimens.xml 的三个重要原因,什么时候应该在 Android 中使用 dimens.xml 文件?
@Jesús Castro 你做得对。 在 dimens.xml 文件中维护值比在所有布局文件中乱扔硬编码值要好。
例如,想象一下您在所有视图中增加左右边距的情况。 如果您使用在 dimens.xml 中维护的单个值,这将是一个快速更改 - 单个文件中的单个值。 但是,如果您在布局文件中将边距值作为文字值(例如“16dp”)(而不是使用像“@dimen/leftright_margin”这样的尺寸值),则必须编辑每个容易出错的布局文件而且很费时间。
我有一种新颖的方法,我认为它与问题保持一致。 我一直在避免使用 Xml 以避免解析 xml 代码的成本。
我没有使用 xml 维度,而是使用 java 常量。 任何一个...
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;
}
}
yes absolutely 最好将值保留在 dimens.xml 文件中
我不知道它是否可以帮助你,但我写了一个小的 java 程序,它允许你用一个新的期望值复制一个维度 xml 文件,这样你就不再需要逐行手工完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.