FrameLayout 高度与父级不匹配

Posted

技术标签:

【中文标题】FrameLayout 高度与父级不匹配【英文标题】:FrameLayout height not matching parent 【发布时间】:2017-05-25 21:53:13 【问题描述】:

我在 AlertDialog 中有以下布局作为自定义视图。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:gravity="center"
    android:padding="16dp">

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_gravity="center"
        android:orientation="vertical">

        <GridLayout
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:columnCount="3">

            <TextView
                android:id="@+id/code1"
                android:layout_
                android:layout_
                android:gravity="center"
                android:text="\u2022"
                android:textSize="@dimen/match_code_digit_size"
                tools:ignore="HardcodedText" />

            <TextView
                android:id="@+id/code2"
                android:layout_
                android:layout_
                android:layout_marginBottom="20dp"
                android:gravity="center"
                android:text="\u2022"
                android:textSize="@dimen/match_code_digit_size"
                tools:ignore="HardcodedText" />

            <TextView
                android:id="@+id/code3"
                android:layout_
                android:layout_
                android:gravity="center"
                android:text="\u2022"
                android:textSize="@dimen/match_code_digit_size"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k1"
                android:layout_
                android:layout_
                android:text="1"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k2"
                android:layout_
                android:layout_
                android:text="2"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k3"
                android:layout_
                android:layout_
                android:text="3"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k4"
                android:layout_
                android:layout_
                android:text="4"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k5"
                android:layout_
                android:layout_
                android:text="5"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k6"
                android:layout_
                android:layout_
                android:text="6"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k7"
                android:layout_
                android:layout_
                android:text="7"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k8"
                android:layout_
                android:layout_
                android:text="8"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k9"
                android:layout_
                android:layout_
                android:text="9"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/k0"
                android:layout_
                android:layout_
                android:layout_column="1"
                android:text="0"
                android:textSize="@dimen/match_code_button_text"
                tools:ignore="HardcodedText" />

        </GridLayout>

        <TextView
            android:id="@+id/error"
            style="@style/ErrorText"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:gravity="center"
            android:text="@string/match_error"
            android:visibility="invisible" />

    </LinearLayout>

    <FrameLayout
        android:id="@+id/progress"
        android:layout_
        android:layout_
        android:background="#80ffffff"
        android:visibility="visible">

        <ProgressBar
            android:layout_
            android:layout_
            android:layout_gravity="center" />

    </FrameLayout>

</FrameLayout>

抱歉,排版量大,按原样放在这里。

注意底部的带有 progress 的 FrameLayout。尽管它有 android:layout_,但在设备上它看起来像“wrap_content” - 高度只匹配内部 ProgressBar。 尽管在 Android Studio 设计器中完美展示,占据了整个视图。

怎么了?

这是 AS 设计器中的布局外观

在设备上(模拟器和真机都试过,效果一样)

【问题讨论】:

你能把图片和预期的输出也发一下吗 为您的子框架布局添加重力 @Alexey 检查我的答案 @Alexey 我的回答肯定会有所帮助! 【参考方案1】:

尝试将根FrameLayout改为RelativeLayout

【讨论】:

【参考方案2】:

您有两个 FrameLayout。 @id progress 一个和一个LinearLayout 一个。

首先快速浏览一下developer.android.com

FrameLayout 的设计目的是在屏幕上屏蔽一个区域以显示 单个项目。一般情况下,应该使用 FrameLayout 来容纳单个 子视图,因为在一个子视图中组织子视图可能很困难 在没有孩子的情况下可扩展到不同屏幕尺寸的方式 相互重叠。

那么对于你的父母FrameLayout你有几个孩子?(2)

但是,您可以向 FrameLayout 和控件添加多个子项 它们在 FrameLayout 中的位置通过将重力分配给每个 孩子,使用 android:layout_gravity 属性。

你的两个孩子都有重力吗?不,不是为了@id 进度

子视图绘制在堆栈中,最近添加的子视图 在上面。 FrameLayout 的大小是其最大子项的大小 (加上填充),可见与否(如果 FrameLayout 的父级允许)。

所以首先你添加线性布局,然后你添加 FrameLayout 所以.. child FrameLayout 应该在顶部,它是。那是你的问题吗?

即使你的布局很长,也可以缩短到这个

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:gravity="center"
    android:padding="16dp">

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_gravity="center"
        android:background="#121"
        android:orientation="vertical">
    </LinearLayout>

    <FrameLayout
        android:id="@+id/progress"
        android:layout_
        android:layout_
        android:layout_gravity="center"
        android:background="#567"
        android:visibility="visible">

        <ProgressBar
            android:layout_
            android:layout_
            android:layout_gravity="center" />

    </FrameLayout>

</FrameLayout>

输出(我为您的 child 框架布局中缺少 gravity 的线性布局添加了图像):

【讨论】:

【参考方案3】:

我遇到了同样的问题并设法解决了它。似乎没有人注意到这一点,但问题的根源是GridLayout。正如您在蓝图中看到的那样,FrameLayout 没有问题,因为它确实与父级匹配。 GridLayout 的项目具有固定大小,这是错误的。您需要为GridLayout 中的每个项目设置权重,以便项目可以拉伸以适应任何屏幕分辨率。但是GridLayout 中的权重需要 API 21。所以我建议您使用嵌套的 LinearLayout's 并将项目的权重设置为 1。

【讨论】:

不,已经尝试过使用一组 LinearLayout 而不是 GridLayout - 同样的问题 :( 你将物品的宽度和高度设置为固定还是带权重? 我想说的是你不应该使用dimen文件夹中的尺寸。【参考方案4】:

我在项目中遇到的问题是,我有两个具有相同 ID 的 Frame 布局。 解决方案是为框架布局分配唯一的 ID。

希望这对未来的读者有所帮助。

【讨论】:

以上是关于FrameLayout 高度与父级不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Android子视图高度与ListView项目中的父级不匹配

ListView布局高度与Fragment中的RecyclerView内的父级不匹配

向 ListView 添加标题的宽度与父级不匹配

BottomAppBar backgrounTint 与父级不正确匹配并显示在屏幕的一半

无法将框架布局高度设置为匹配父级

约束布局与嵌套滚动视图中的父级不匹配