gpt4 book ai didi

ListView的Android LinearLayout权重和wrap_content

转载 作者:行者123 更新时间:2023-11-29 14:13:37 25 4
gpt4 key购买 nike

我想创建一个两列布局。第一列应该是一个 List,它的宽度应该是他们想要的。第二列应该是 FrameLayout 并且应该占据所有剩余空间。
如果我使用以下布局,我可以达到预期效果:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="ru.automatikaplus.caliberadmin.TestActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" />

<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/colorGreen"/>

</LinearLayout>


</android.support.design.widget.CoordinatorLayout>

结果:

Screenshot_1

FrameLayout 为清晰起见为绿色。

但是! 如果我将 RecyclerView 更改为 ListView 或任何其他 - 此布局不起作用:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="ru.automatikaplus.caliberadmin.TestActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<ListView
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" />

<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/colorGreen"/>

</LinearLayout>


</android.support.design.widget.CoordinatorLayout>

enter image description here

FrameLayout 没了,ListView 占了所有空间。为什么?

如何使用 ListView 而不是 RecycleView 从第一个屏幕截图开始布局?

编辑1:该方案在简单情况下非常有效。例如,有三个 TextViews,两个带有 wrap_content,一个带有 weight=1:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="Test1"/>

<TextView
android:id="@+id/text2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_weight="1"
android:background="@color/colorGreen"
android:text="Test2"/>

<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="Test3"/>

</LinearLayout>

它就像一个魅力,中间 TextView 占用所有可用空间:

enter image description here

但这不适用于 ListView。我需要 ListView 只占用他需要的空间,而不是 0.3 的屏幕,不是 dp 的硬编码值,只是一个 wrap_content

Edit2:列表项布局如下:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textSize="18sp"/>

Edit3: 我可以告诉你更多:如果你从第二个例子中删除所有的东西,只留下 CoordinatorLayoutListView 在里面,无论 wrap_content 宽度如何,ListView still 都会全屏显示。为什么?

最佳答案

如下更改 xml 中 listview 的代码

    <ListView
android:id="@+id/list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3" />

因为您在线性布局中对第一个子项使用 wrap_content,在线性布局中对第二个子项使用 layout_weight,所以它可能会导致奇怪的行为。WRAP_CONTENT 将空间精确地占用到项目大小,因此在您的情况下可能是可能列表需要屏幕的所有空间

关于ListView的Android LinearLayout权重和wrap_content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37543885/

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