CoordinatorLayout不能正常工作。

11

我正在尝试从新宣布的Android设计支持库中实现CoordinatorLayout,并且我已经按照示例这里在我的XML布局中使用了以下代码:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <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/ThemeOverlay.AppCompat.Light"
        app:layout_scrollFlags="scroll|enterAlways"/>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

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

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

然而当我向下滚动视图时,操作栏并没有隐藏。我想不出为什么会这样。

编辑:据我所知,CoordinatorLayout 似乎无法与 ListView/GridView/ScrollViews 一起使用,只能与 RecyclerViewNestedScrollView 一起使用。不幸的是,对我来说简单地切换到其中一个视图是不可能的,因此我仍在寻找解决方案。


您可以在API21+中使用ListView/GridView和CoordinatorLayout。 - Gabriele Mariotti
5个回答

6

目前,不是所有视图都具有与CoordinatorLayout预期的行为相同的行为。

您的视图应实现NestedScrollView接口并处理嵌套滚动事件。

RecyclerViewNestedScrollView(版本22)支持此行为。但是,您也可以使用AbsListView(ListViewGridView),但仅限于API21+。

只需添加以下内容:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     listView.setNestedScrollingEnabled(true);
}

1
谢谢你!你让我的一天变得美好。 - Ken Ratanachai S.

4
我认为你需要让你的ListView实现ScrollingViewNestedScrollingChild接口。 这并不是一件容易的事情,但如果你查看RecyclerView的源代码,你应该能够做到。它使用了一个NestedScrollingChildHelper,你也可以这样做。

2
仅仅在你的ListView中实现NestedScrollingChild接口是不够的。请查看:https://dev59.com/MF0a5IYBdhLWcg3wHlik#30885092 - Gabriele Mariotti

0
视图可以通过使用CoordinatorLayout.DefaultBehavior(YourView.Behavior.class)注释声明默认行为,或者在布局文件中使用app:layout_behavior="com.example.app.YourView$Behavior"属性设置。该框架使得任何视图都可以与CoordinatorLayout集成。
因此,我认为解决方案是覆盖AppBarLayout.Behavior类。

0

这取决于您在 ViewPager 中显示的内容。如果您使用列表/RecyclerView,则应该可以正确滚动。


我在ViewPager中使用了几个视图,其中之一是ListView。我尝试过仅使用ListView,但没有任何区别。 - dnlbaines
我的应用程序正在将文章列表加载到ListView中,但使用了另外两个视图,一个用于显示进度旋转器,另一个用于在没有加载文章时显示一些文本 - 如果只使用RecyclerView,我该如何实现这一点? - dnlbaines
视图需要可滚动,否则您将无法获得所需的效果。您可以尝试将所有视图包装在“NestedScrollView”中,但不建议在另一个可滚动视图中使用类似列表的东西,可能会出现奇怪的次要问题。 - aows
我还没有查看源代码,但我猜测这里的 CoordinatorLayout 正在等待“滚动事件”以折叠工具栏(这就是为什么您需要添加 app:layout_behavior="@string/appbar_scrolling_view_behavior")。如果您使用布局,则永远不会触发该事件。再次强调,这只是一个猜测。 - aows
1
似乎只有RecylerView和NestedScrollView可以与之配合使用,而ListView和ScrollView则不行。除非有解决方法,否则这基本上使得这个功能对我来说毫无用处。 - dnlbaines
显示剩余4条评论

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接