有一项活动我想在手机中填满屏幕 并弹出(对话框)平板电脑。
我以为我制作了这样的布局文件,
<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元素。 有帮助吗?谢谢!
答案 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打开了一个问题:
答案 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/
让我们尝试定义match_parent和wrap_content而不使用格式:
<item name="match_parent" type="dimen">-1</item>
<item name="wrap_content" type="dimen">-2</item>
我们可以在任何其他维度值中引用它们:
<!-- 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>
欲了解更多信息,请访问我之前提到的网页!
答案 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 这样的有意义的值,这些值在设备上不能可靠地工作,不仅基于我,还基于其他人的评论。