【问题标题】:AppBarLayout hiding toolbar on scroll behavior, switching fragmentsAppBarLayout在滚动行为上隐藏工具栏,切换片段
【发布时间】:2016-02-24 23:10:12
【问题描述】:

我已经实现了一个CoordinatorLayout 并将我的Toolbar 包裹在一个AppBarLayout 中,这样工具栏在滚动时就会隐藏起来。大部分应用程序包含在@id/container FrameLayout 中交换进出的片段,如下所示。一些片段只是RecyclerViews,而另一些则是其他布局。我已将app:layout_behavior="@string/appbar_scrolling_view_behavior" 添加到@id/container FrameLayout。这是我的主要布局:

<DrawerLayout>

     <RelativeLayout
        android:id="@+id/mainRelativeLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <android.support.design.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"  
            >

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

                <Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:elevation="5dp"
                    app:layout_scrollFlags="scroll|enterAlways"
                    >

                </Toolbar>

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

            <FrameLayout
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"
                />

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

    </RelativeLayout>

<!-- ignore -->
<drawercontents>
</DrawerLayout>

现在,Toolbar 在带有 RecyclerView 的片段上滚动时会隐藏自己。

问题是,当切换到另一个没有RecyclerView 的片段时,它会弄乱那个片段布局。例如,如果我在包含RecyclerView 的片段上向下滚动,Toolbar 将隐藏自己(就像它应该的那样)。然后,如果我切换到没有RecyclerView 的另一个片段,工具栏仍将被隐藏,并且布局将扩展到那个额外的空间。如果我从带有RecyclerView 的片段开始并且不滚动(因此Toolbar 保持可见),然后切换到另一个片段,则内容现在由于Toolbar 而被推下屏幕。

这是问题的截图:http://prnt.sc/a7majo

我还尝试使用以下代码禁用该片段中的滚动行为:

Toolbar mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) mToolbar.getLayoutParams();
toolbarLayoutParams.setScrollFlags(0);
mToolbar.setLayoutParams(toolbarLayoutParams);

AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBarLayout);

CoordinatorLayout.LayoutParams appBarLayoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
appBarLayoutParams.setBehavior(null);
appBarLayout.setLayoutParams(appBarLayoutParams);

这也不起作用,会产生如下图所示的奇怪结果:http://prnt.sc/a7mapg

那么解决方法是什么?我已经看到了一些与此类似的其他问题,但给出的答案似乎不适用于我的情况。提前致谢!

【问题讨论】:

  • 这方面有什么更新吗?你解决了吗?
  • 好吧,我最终完全改变了应用程序的结构,但是对于这个特殊问题,我能够通过强制 AppBarLayout 扩展某些片段来获得解决方案。
  • 是的,我刚刚解决的也是,关键是每次提交另一个片段时根据片段更改appbarlayout参数,我将发布代码sn-p作为答案。

标签: android android-layout android-fragments android-coordinatorlayout android-appbarlayout


【解决方案1】:
protected void setScrollingEnabled(boolean isEnabled) {
    AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
    params.setScrollFlags(isEnabled ? (AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS) : 0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2017-06-15
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多