如何使用资源文件使用layout_width?

时间:2011-07-28 12:58:07

标签: android resources fill-parent

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

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

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

并将width的值外部化为

in values / dimens.xml

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

in values-xlarge / dimens.xml

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

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

9 个答案:

答案 0 :(得分:18)

我找到的最佳方式: - 而不是“match_parent”和“fill_parent”写“-1dp” - 而不是“wrap_content”写“-2dp”

答案 1 :(得分: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() rounds negative dimensions incorrectly

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

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

您可以将-1px或-2px用于match_parent,但wrap_content必须为-3px。这两种组合都适用于设备和模拟器。

实际上,我发现当-1px用于match_parent时,IntelliJ的预览功能无法呈现布局,并且当被另一个维度引用时,错误地呈现-2px就好像它是“wrap_content”一样。 <dimen name="my_width">@dimen/match_parent</dimen>。我为IntelliJ IDEA打开了一个问题:

Android Preview cannot render layout_width="-1px"

答案 2 :(得分:9)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分: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>

这允许您根据当前配置混合大小调整行为常量,如MATCH_PARENT和具体大小 dp

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

<LinearLayout
    android:layout_width="@dimen/width_match_unless_huge"
    .../>

答案 5 :(得分:2)

根据这一伟大贡献: 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> 
    
  3. 欲了解更多信息,请访问我之前提到的网页!

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

值/ integers.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">

答案 8 :(得分:0)

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

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

示例:

styles.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 这样的有意义的值,这些值在设备上不能可靠地工作,不仅基于我,还基于其他人的评论。