ListView 与 CoordinatorLayout 中的 SearchView 重叠
Posted
技术标签:
【中文标题】ListView 与 CoordinatorLayout 中的 SearchView 重叠【英文标题】:A ListView overlaps a SearchView in a CoordinatorLayout 【发布时间】:2021-07-18 23:30:46 【问题描述】:我在 androidX 迁移后修复了一个应用程序,我遇到了一个非常奇怪的错误,即我的 ListView
没有在 onCreate
/onStart
/onResume
事件中加载:
A ListView is not displaying any data on OnCreate/OnStart after AndroidX migration
机缘巧合,我决定“简化”我的布局并删除包含ListView
的LinearLayout
。在此更改之后,数据已正确加载,因为似乎 LinearLayout
以某种方式阻止了 getView
事件。但是,在此更改之后,SearchView
与ListView
重叠,我不知道如何将它们按正确的顺序排列(首先是SearchView
,然后是ListView
)。
这就是现在的样子:
这是我的代码:
other_ruins.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
android:orientation="vertical">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_weight="1"
android:layout_
android:layout_>
<include layout="@layout/search_container" />
<ListView
android:id="@+id/lstOtherRuins"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:nestedScrollingEnabled="true"
android:layout_margin="8dp"
android:layout_
android:layout_
android:choiceMode="singleChoice"
android:layout_below="@id/toolbar_container"
android:layout_gravity="left|start" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_
android:layout_
app:adSize="SMART_BANNER"
app:adUnitId="@string/banner_ad_unit_id" />
</LinearLayout>
search_container.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<FrameLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_container"
android:theme="@style/AppTheme.AppBarOverlay"
android:layout_
android:layout_>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
app:theme="@style/ToolBarStyle"
android:layout_
android:layout_
android:background="@color/colorPrimary" />
<com.miguelcatalan.materialsearchview.MaterialSearchView
android:id="@+id/search_view"
android:layout_
android:layout_ />
</FrameLayout>
关于 search_container 我也使用AppBarLayout
进行了测试并导致应用程序崩溃;因此,这不是解决方案。
知道如何解决吗?为什么会这样?如果您知道如何解决上一个问题并以某种方式在onCreate
/onStart
/onResume
事件上调用getView
事件是另一种解决方案。
【问题讨论】:
只是没有注意到您在发布答案之前使用AppBarLayout
进行了测试.. 您能否显示使用时引发的崩溃报告
【参考方案1】:
您需要将search_container.xml
中的FrameLayout
替换为AppBarLayout
,因为当您在CoordinatorLayout
中使用Toolbar
时,AppBarLayout
应该包裹Toolbar
<?xml version="1.0" encoding="UTF-8" ?>
<com.google.android.material.appbar.AppBarLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_container"
android:theme="@style/AppTheme.AppBarOverlay"
android:layout_
android:layout_>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
app:theme="@style/ToolBarStyle"
android:layout_
android:layout_
android:background="@color/colorPrimary" />
<com.miguelcatalan.materialsearchview.MaterialSearchView
android:id="@+id/search_view"
android:layout_
android:layout_ />
</com.google.android.material.appbar.AppBarLayout>
【讨论】:
这是部分解决方案,但仍然给了我一些指导。您需要将两者结合起来才能使其工作。谢谢赞恩。【参考方案2】:在我的例子中,我需要用AppBarLayout
包裹我的FrameLayout
使其正常工作,当我没有这样做时,它会复制工具栏并创建一个奇怪的阴影。这是最后的变化:
<?xml version="1.0" encoding="UTF-8" ?>
<com.google.android.material.appbar.AppBarLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_container"
android:layout_
android:layout_>
<FrameLayout
android:layout_
android:layout_>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
app:theme="@style/ToolBarStyle"
android:layout_
android:layout_
android:background="@color/colorPrimary" />
<com.miguelcatalan.materialsearchview.MaterialSearchView
android:id="@+id/search_view"
android:layout_
android:layout_ />
</FrameLayout>
</com.google.android.material.appbar.AppBarLayout>
只有其中一个会破坏应用程序。
【讨论】:
以上是关于ListView 与 CoordinatorLayout 中的 SearchView 重叠的主要内容,如果未能解决你的问题,请参考以下文章
ListView,减少 ListView 中一个元素与另一个元素之间的空间