gpt4 book ai didi

android - match_parent 未按预期执行

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:33 24 4
gpt4 key购买 nike

我想这应该是一个相当容易回答的问题,如果您比我更了解 XML 布局的话。在使用 ma​​tch_parent layout_height 时,我似乎没有得到我认为应该得到的结果。

我有一个带有 android:orientation="vertical"LinearLayout 根元素。在这个 LinearLayout 中,我想要三个元素:- TextView - 列表显示- TextView

对于这两个 TextView,我都设置了 android:layout_height="wrap_content" 以便它们的高度只达到显示其内容所需的高度。问题是,我希望一个 TextView 位于表单的顶部,另一个位于表单的底部,而 ListView 填充表单上的任何可用空间。所以这是我的 xml 布局的样子:

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="Top TextView" />

<ListView
android:id="@+id/listView_Species"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="Bottom TextView" />

但它不起作用。这就是我得到的。我选择了 ListView,以便突出显示。请注意它是如何一直延伸到表单底部的,将底部的 TextView 推离表单。 XML Layout 1

当我将 ListView 的 layout_height 属性更改为某个固定值(例如 180dp)时,这就是表单的外观。我只是发布这个来证明底部的 TextView 在那里,但我仍然不知道如何将它固定到屏幕底部,而 ListView 占据了剩余的任何空间,但在两个 TextView 之间。

XML Layout 2

提前致谢。

最佳答案

虽然其他答案试图解决您的问题(他们实际上并没有——他们建议您做一些看起来相似但在不同设备上可能看起来不错也可能不好看的东西),但没有人填补了您对 LinearLayouts 和 match_parent 知识的空白。这些差距非常普遍——Google 的文档仍然远远不够出色。

首先,Views 如何在 LinearLayout 中工作?为了简单起见,让我们使用 orientation="vertical" 完成绘制 LinearLayout 的过程。

  1. 检查 LinearLayout(简称 LL)的第一个 child 的高度。如果高度为 match_parentfill_parent(同一事物的旧名称),则 View 的高度将被拉伸(stretch)以填满整个查看区域。如果高度为 wrap_content,则测量 View 占用的垂直空间并将该空间用于 View 。如果高度是一个非零数字,则为 View 的高度使用恰好那么多的像素(如果太小可能会被裁剪)。如果高度为 0,请参见下文。
  2. 将下一个 View 放在 1 中的 View 下方。检查其高度并采取相应措施。
  3. 继续所有 View 。如果某个 View 被推离底部,请继续并停止计算,因为没有人会看到它或任何后续 View (假设没有 ScrollView)。
  4. 如果 View 的高度为 0,请检查它的重力。这需要第二遍,存储所有 View 的重力,然后按比例分配它们的高度。您可以猜到,第二遍使布局所需的时间加倍,这对于简单布局而言并不重要。

示例说明:测量 LL 的第一个子项(第一个 TextView)并占用一定数量的像素。然后您的 ListView 占用所有剩余空间(通过 match_parent)。然后你的第二个 TextView 根本没有被绘制,因为它位于屏幕底部。这几乎就是您所观察到的,但现在您明白为什么了。

解决方案:使用RelativeLayout。在这种情况下效果很好。

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:id="@+id/top_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textSize="30sp"
android:text="Top TextView" />

<TextView
android:id="@+id/bottom_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:textSize="30sp"
android:text="Bottom TextView" />

<ListView
android:id="@+id/listView_Species"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_tv"
android:layout_above="@id/bottom_tv"
/>
</RelativeLayout>

RelativeLayout 告诉布局 inflater 在顶部绘制第一个 TextView,然后在底部绘制第二个 TextView,然后用您的 ListView 填充其余空间。我相信这正是您想要的。

欢迎使用安卓。您会经常使用这种模式!

关于android - match_parent 未按预期执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com