29

有一个活动我想在手机中填充屏幕并为平板电脑弹出(对话框)。

我以为我制作了这样的布局文件,

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="@dimen/main_layout_width"
  android:layout_height="match_parent">

并将宽度的值外部化为

在值/dimens.xml 中

<dimen name="tutorial_width">match_parent</dimen>

在值-xlarge/dimens.xml

<dimen name="tutorial_width">320dp</dimen>

但我不能将 'match_parent' 表示为 dimen 元素。有什么帮助吗?谢谢!

4

9 回答 9

19

我发现的最好方法: - 而不是“match_parent”和“fill_parent”写“-1dp” - 而不是“wrap_content”写“-2dp”

于 2012-03-09T09:10:01.477 回答
16

dp取决于设备显示指标,并且在没有一组特定于密度的覆盖的情况下无法在所有设备上使用,但是,px可以改为使用。

不幸的是,使用的简单舍入技术TypedValue#complexToDimensionPixelSize()仅考虑非负值:

final int res = (int)(f+0.5f);
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;

当 f(px 值)为负时,结果通常会被错误地舍入,因为它总是使用加法。对于负px尺寸,观察到以下像素大小:

0px = 0.0
-1px = -1.0
-2px = -1.0
-3px = -2.0
-4px = -3.0
-5px = -4.0
...

我为此方法打开了一个 AOSP 问题:

TypedValue#complexToDimensionPixelSize() 错误地舍入负尺寸

考虑到这种行为,以下值将适用于所有设备:

<dimen name="match_parent">-2px</dimen>
<dimen name="wrap_content">-3px</dimen>

match_parent 可以使用 -1px 或 -2px,但 wrap_content 必须为 -3px。任何一种组合都适用于设备和模拟器。

在实践中,我发现 IntelliJ 的预览功能在将 -1px 用于 match_parent 时无法呈现布局,并且在另一个维度(例如<dimen name="my_width">@dimen/match_parent</dimen>. 我为 IntelliJ IDEA 打开了一个问题:

Android Preview 无法呈现 layout_width="-1px"

于 2013-10-19T01:50:20.110 回答
12

我用一种风格来解决这个问题。为不同的屏幕尺寸使用带有 android:layout_width 项目的单独 xml 样式元素解决了该问题,而无需使用未记录的 -1dp

于 2013-05-25T21:10:40.603 回答
3

我还不能发表评论,所以我正在写新的答案。我在我的项目中使用了@pjanecze 提供的答案。一切都很好,直到几天前突然一些设备开始报告奇怪的小部件定位。具有非常高密度的设备,而不是从我的尺寸中获取 match_parent 为 -1(这相当于布局参数中的 android 常量 match_parent = -1),它得到了 -2,这意味着宽度设置为 wrap_content(-2 在布局参数)。显然是因为 -1dp 在运行时转换为像素,而 -1dp 在某些情况下是 -2px。

所以...而不是使用常量 -1dp 和 -2dp,您应该使用 -1px 和 -2px 作为 match_parent 和 wrap_content。

于 2013-08-07T12:41:54.480 回答
3

什么对我有用,并且可能具有学术正确性,如下所示:

<!-- In values/dimens.xml -->
<item name="width_match_unless_huge" type="dimen" format="integer">-1</item>

<!-- In values-sw600dp/dimens.xml -->
<item name="width_match_unless_huge" type="dimen" format="dimension">600dp</item>

这允许您根据当前配置在dpMATCH_PARENT中混合大小行为常量和具体大小。

您可以将其用作常规<dimen/>

<LinearLayout
    android:layout_width="@dimen/width_match_unless_huge"
    .../>
于 2016-02-24T19:05:42.583 回答
3

根据这个伟大的贡献: http ://blog.danlew.net/2015/01/06/handling-android-resources-with-non-standard-formats/

  1. 让我们尝试在没有格式的情况下同时定义 match_parent 和 wrap_content:

    <item name="match_parent" type="dimen">-1</item>
    <item name="wrap_content" type="dimen">-2</item>
    
  2. 我们可以在任何其他维度值中引用它们:

    <!-- Inside /res/values/dimens.xml -->
    <dimen name="responsive_width">@dimen/match_parent</dimen>
    
    <!-- Inside /res/values-sw800dp/dimens.xml -->
    <dimen name="responsive_width">800dp</dimen> 
    

欲了解更多信息,请访问我之前提到的网页!

于 2016-05-25T15:10:52.067 回答
0

您可以创建两个布局 - 默认在“layout”目录中使用 android:layout_height="match_parent",在“layout-xlarge”目录中使用平板电脑 android:layout_height="320dp"

于 2011-07-28T13:58:07.763 回答
0

如前所述https://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT MATCH_PARENT = -1 和 WRAP_CONTENT = -2。我没有将值声明为维度资源,而是成功声明并将它们用作整数资源。因此,为了使示例正常工作,您可以使用两个 Integer 资源文件:

值/整数.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="tutorial_width">-1</integer>
</resources>

值-sw600dp/integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="tutorial_width">-2</integer>
</resources>

布局文件将是:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="@integer/tutorial_width"
  android:layout_height="match_parent">
于 2014-02-24T18:18:37.843 回答
0

值 -1 在 Pixel 4 的 android api 30 模拟器上对我不起作用。

sw600dp/styles.xml干净的解决方案是在样式 fe 中为您的组件定义和创建基本样式,然后在 sw600dp 中DialogControllerTypeGridBase创建其他作为父级的组件。DialogControllerTypeGrid

例子:

样式.xml

<style name="DialogControllerTypeGridBase" parent="CSGridMatch">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:background">@drawable/background_bordered_section</item>
    <item name="android:horizontalSpacing">8dp</item>
    <item name="android:padding">4dp</item>
    <item name="android:verticalSpacing">8dp</item>
</style>

<style name="DialogControllerTypeGrid" parent="DialogControllerTypeGridBase">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:numColumns">6</item>
</style>

sw600dp/styles.xml

 <style name="DialogControllerTypeGrid" parent="DialogControllerTypeGridBase">
        <item name="android:layout_width">450dp</item>
        <item name="android:numColumns">3</item>
 </style>

这样就不会重复任何内容,并且您不会使用 -1、-2 之类的有意义的值,这些值不仅基于我,而且基于其他人的评论,在设备上不能可靠地工作。

于 2021-07-11T19:46:26.850 回答