使用协调器布局以编程方式隐藏工具栏

hide toolbar programmatically with coordinator layout

经过广泛搜索后,令人惊讶的是,似乎没有人对相同的行为感兴趣。如果我错过了,请指出合适的地方。

问题如下: 我在主 activity xml 中有一个协调器布局。在协调器布局内部有一个视图寻呼机。在我放入视图寻呼机的三个片段中的两个片段中,有回收视图触发工具栏在协调器布局中的隐藏。第三个片段虽然没有回收视图。问题是,当显示工具栏时,第三个片段被绘制得比它应该的低,隐藏了屏幕底部边缘下方的 ui 的一部分。如果工具栏被隐藏,一切都会正常显示。

所以问题是 - 如何以编程方式隐藏工具栏?例如当用户滑动到视图寻呼机中的第三个片段时?

如果您认为有更好的方法 - 我也很乐意听到。谢谢!

回答你的问题:

我假设您的 Toolbar 包含在 AppBarLayout 中。 要实现它,您可以将 ViewPager.OnPageChangeListener 添加到您的 ViewPager,并在 onPageSelected() 回调调用 setExpanded() 中对您的 AppBarLayout :

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
            @Override
            public void onPageSelected(int position) {
                if(position == 2) { //the position of your non-scrolling fragment
                    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
                    appBarLayout.setExpanded(false, true); //Hide the toolbar.
                }
            }
            @Override
            public void onPageScrollStateChanged(int state) { }
        });

替代方法:

另一种方法,不会说更好,我会让你根据你的内容和用户交互来判断,可以是在你的 non-recycler 片段上保持相同的滚动效果。 您可以通过将片段内容包装在 NestedScrollView(包含在 support-v4 中)和相应的 Behaviour 中来轻松实现,这将触发工具栏在 CoordinatorLayout 中的隐藏:

<android.support.v4.widget.NestedScrollView  
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:fillViewport="true">

<!-- Your non-recycler view fragment layout -->

</android.support.v4.widget.NestedScrollView>

关于滚动、制表符和 CoordinatorLayout 的精彩博客 post:https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/