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

Sha*_*kra 27 resources android 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">
Run Code Online (Sandbox Code Playgroud)

并将width的值外部化为

在values/dimens.xml中

<dimen name="tutorial_width">match_parent</dimen>
Run Code Online (Sandbox Code Playgroud)

在values-xlarge/dimens.xml中

<dimen name="tutorial_width">320dp</dimen>
Run Code Online (Sandbox Code Playgroud)

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

pja*_*cze 18

我找到的最好的方法: - 而不是"match_parent"和"fill_parent"写"-1dp" - 而不是"wrap_content"写"-2dp"

  • 这对我很有用.我还定义了以下两个维度,使代码更具可读性:`<dimen name ="match_parent"> - 1dp </ dimen> <dimen name ="wrap_content"> - 2dp </ dimen>` - 那么你可以使用` <dimen name ="tutorial_width"> @ dimen/match_parent </ dimen>`. (11认同)
  • 这不适用于所有设备,因为-1dp与密度有关. (7认同)
  • 这不适用于三星Galaxy S5,请参阅James Wald的解释答案 (2认同)

Jam*_*ald 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;
Run Code Online (Sandbox Code Playgroud)

当f(px值)为负数时,结果通常不正确舍入,因为它总是使用加法.对于负尺寸,观察到以下像素大小px:

0px = 0.0
-1px = -1.0
-2px = -1.0
-3px = -2.0
-4px = -3.0
-5px = -4.0
...
Run Code Online (Sandbox Code Playgroud)

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

TypedValue#complexToDimensionPixelSize()错误地舍入负维度

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

<dimen name="match_parent">-2px</dimen>
<dimen name="wrap_content">-3px</dimen>
Run Code Online (Sandbox Code Playgroud)

您可以将-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预览无法渲染layout_width =" - 1px"


ura*_*dom 9

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

  • 它的值实际上是有记录的,所以使用-1是安全的.http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT (2认同)
  • 这是一种更清洁的解决方案.一个例子可以证明你的观点. (2认同)

小智 0

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

  • 这将是一个痛苦,因为这个单一值,请复制整个 .xml。 (4认同)