在dimens.xml文件中,value等同于match_parent或fill_parent吗?

56
根据此处XML属性部分的说明,我在我的dimens.xml文件中指定以下内容:
<dimen name="match_parent">-1dp</dimen>
<dimen name="main_left_menu_user_account_width">@dimen/match_parent</dimen>
<dimen name="main_left_menu_user_account_height">@dimen/match_parent</dimen>

然后我在我的布局中使用这两个维度:

<ImageView 
    android:id="@+id/userAccountImage"
    android:background="@drawable/user_account"
    android:layout_width="@dimen/main_left_menu_user_account_width"
    android:layout_height="@dimen/main_left_menu_user_account_height" />

当我预览图形布局时,它会抱怨:

您必须提供layout_width属性。

您必须提供layout_height属性。

实际上,我可以在dimens.xml中定义一个值等于match_parent吗?

更新:

我也尝试过这个,但是预览仍然会抱怨:

<dimen name="main_left_menu_user_account_width">-1dp</dimen>
<dimen name="main_left_menu_user_account_height">-1dp</dimen>

我成功使用wrap_contentGraphical Layout没有任何投诉):

<dimen name="wrap_content">-2dp</dimen>

<dimen name="main_right_menu_width">@dimen/wrap_content</dimen>
<dimen name="main_right_menu_height">@dimen/wrap_content</dimen>

1
你尝试过这个了吗?一个选项是使用样式。 - AlexBcn
@AlexBcn 是的,但还是一样的问题。我认为SDK不喜欢-1dp的值,请查看我的编辑过的帖子。 - Rendy
它是如何“抱怨”的?您是否使用最新的Eclipse插件?在布局预览中,我似乎可以无问题地使用-1dp。 - NPike
真的吗?我的SDK是21.1,平台工具是16.0.1。你的呢? - Rendy
2
我正在使用您的方法,其中包括-1dp和-2dp,并且在实际设备(Nexus10)上可以使用,谢谢。 - ernazm
使用样式而不是尺寸。 - enl8enmentnow
6个回答

56

用这个,对我有效

<dimen name="custom_wrap_content">-2px</dimen>  
<dimen name="horizontal_border_height">@dimen /custom_wrap_content</dimen>

<dimen name="custom_match_parent">-1px</dimen>  
<dimen name="vertical_border_height">@dimen /custom_match_parent</dimen>

为什么match_parent无法运行的原因是,您不能提供内置关键字,例如match_parent

编辑: 如评论中的Jarett Millard建议,请使用px代替dp


2
Android Studio 0.5.3,SDK Tools 22.6.1 不支持将整数用作 dimen 值 :( - straya
尝试使用-1dp和-2dp。它们很友好,适用于AS :) - Ivan Morgillo
29
请使用“-1px”和“-2px”代替“dp”。这样,“px”值将不会根据设备屏幕密度进行缩放。 - Jarett Millard
在Android O上,您可以在大多数情况下使用0dp来使其“匹配约束”(如果您正在使用Constraint Layout)。但我仍然不知道如何解决“wrap_content”问题。 - Leonardo Sibela
在我的情况下,-1px的值会重置视图的边距,因此如果您的视图需要一些边距,请使用Fonix的解决方案。它可以正常工作。 - Vít Kapitola

43

首先创建 attribs.xml 文件:

<resources>
    <item name="match_parent" type="dimen">-1</item>
    <item name="wrap_content" type="dimen">-2</item>
</resources>

其次,使用您的尺寸:

   <dimen name="account_width">@dimen/match_parent</dimen>
   <dimen name="account_height">@dimen/wrap_content</dimen>

2
这给了我一个Resources $NotFoundException.. :( - mco
1
分别是 -1px-2px。首先,不是 dp 而是 px,因为需要进行缩放。其次,在没有尺寸分类的情况下,模拟器 API 25 在运行时会出现错误 layout_width not specified 或类似的错误。 - vigilancer
1
目前看起来似乎可以工作 :) 我使用了 custom_match_parentcustom_wrap_content 作为名称,以免混淆。 - Albert Vila Calvo

27

根据你想要在 @dimen 中定义 match_parent 的原因不同,这个用例可能会对你有所帮助:

你可以将宽度和高度定义为 styles.xml 中的一个样式,而不是在 dimen.xml 中定义。

我使用:

//res/values/styles.xml
<style name="IntroLayout">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
</style>
//res/values-sw600dp/styles.xml
<style name="IntroLayout">
    <item name="android:layout_width">520dp</item>
    <item name="android:layout_height">wrap_content</item>
</style>

并像这样使用它

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_gravity="center"
                style="@style/IntroLayout">

这使我能够动态设置不同尺寸设备的宽度和高度属性,而无需编写任何代码,并且您可以正常使用match_parent/wrap_content。如果有需要,您也可以在样式中使用之前定义过的任何@dimen。

我之所以使用这个功能,是因为手机和平板电脑的布局相同,只是我想在平板电脑上固定宽度,在手机上填充父元素,这样就不必拥有基本相同的两个不同布局的xml文件了。


3
这应该被接受为正确答案,因为它没有使用类似于“-1dp”和“-2dp”这样的神奇数字,并显式地指定了尺寸。 - Georgi
我喜欢这句话的表达方式,但是在某些情况下,如果布局文件中没有明确定义layout_heightlayout_width,你的应用程序可能会崩溃。 - Sam

10

对于HTC设备,请使用以下代码实现match_parent:

<dimen name="my_match_parent">-1.0px</dimen>

1
你也可以使用 integers.xml 文件来实现这一点。 integers.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="match_parent">-1</integer>
    <integer name="wrap_content">-2</integer>
</resources>

在dimens.xml中使用:

<dimen name="main_right_menu_width">@integer/wrap_content</dimen>

你可能也会收到lint警告,为了抑制它,请使用:
<dimen name="main_right_menu_width" tools:ignore="ReferenceType">@integer/wrap_content</dimen>

0

我不这么认为。@dimen/match_parent是带单位的特定长度,而match_parent是一个特殊的标志。


1
但是我成功地使用了wrap_content这个技巧。请查看我的编辑后的帖子。 - Rendy
@Rendy,@dimen/wrap_content的行为与wrap_content相同吗? - Bolton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接