54

我正在使用 appcompat / support-v7 中引入的新工具栏小部件。我想根据用户是否向上/向下滚动页面来隐藏/显示工具栏,就像在新的 Google 的 playstore 应用程序或 NewsStand 应用程序中一样。工具栏小部件中是否为此内置了一些东西,或者我应该将它与 FrameLayout 和 ObservableScrollView 结合使用?

4

12 回答 12

79

据我所知,没有什么可以为你做这件事。但是,您可以查看 Google IO 源代码,尤其是BaseActivity。搜索“自动隐藏”或查看onMainContentScrolled

为了隐藏Toolbar你可以做这样的事情:

toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();

如果您想再次显示它,请致电:

toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
于 2014-10-24T12:06:32.947 回答
42

要隐藏工具栏,您可以这样做:

getSupportActionBar().hide();

所以你只需要有一个滚动监听器并在用户滚动时隐藏工具栏!

于 2015-02-16T02:41:01.013 回答
27

隐藏:

getSupportActionBar().hide();

节目:

getSupportActionBar().show();
于 2016-05-02T02:14:54.137 回答
16

答案很简单。只需OnScrollListener在侦听器中实现并隐藏/显示您的工具栏。例如,如果您有 listview/recyclerview/gridview,则按照示例进行操作。

在您的MainActivity Oncreate方法中,初始化工具栏。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
}

然后实施OnScrollListener

public RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
        boolean hideToolBar = false;
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (hideToolBar) {
                ((ActionBarActivity)getActivity()).getSupportActionBar().hide();
            } else {
                ((ActionBarActivity)getActivity()).getSupportActionBar().show();
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (dy > 20) {
                hideToolBar = true;

            } else if (dy < -5) {
                hideToolBar = false;
            }
        }
    };

我的想法来自:https ://stackoverflow.com/a/27063901/1079773

于 2015-01-28T09:30:47.330 回答
8

Android 设计支持库可用于显示/隐藏工具栏。

看到这个。 http://android-developers.blogspot.kr/2015/05/android-design-support-library.html

这里有详细的示例。 http://inthecheesefactory.com/blog/android-design-support-library-codelab/en

于 2015-07-14T08:12:58.390 回答
2

在滚动内容时,实际上有很多方法可以隐藏/显示工具栏。其中一种方法是通过 Android 设计支持库或更具体地说是 Coordinator 布局来实现。超强的框架布局。

基本上你需要做的就是在你的布局文件中有以下结构,你应该能够达到你想要的结果。

<CoordinatorLayout>
   <AppBarLayout>
   </AppBarLayout>
   <NestedScrollView>
   </NestedScrollView>
</CoordinatorLayout>

我实际上制作了一个视频来解释如何逐步完成它。随意检查一下,如果有帮助,请告诉我。谢谢!:)

https://youtu.be/mEGEVeZK7Nw

于 2016-12-27T06:01:14.523 回答
2

只需在工具栏中添加此属性即可

app:layout_scrollFlags="scroll|enterAlways"

是不是很棒

于 2017-02-12T13:13:27.137 回答
1

我一直在尝试实现相同的行为,这是显示和隐藏工具栏的代码首当其冲(放入包含 RecyclerView 的任何类中):

int toolbarMarginOffset = 0

private int dp(int inPixels){
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, inPixels, getApplicationContext().getResources().getDisplayMetrics());
}

public RecyclerView.OnScrollListener onScrollListenerToolbarHide = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        toolbarMarginOffset += dy;
        if(toolbarMarginOffset>dp(48)){
            toolbarMarginOffset = dp(48);
        }
        if(toolbarMarginOffset<0){
            toolbarMarginOffset = 0;
        }
        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)toolbar.getLayoutParams();
        params.topMargin = -1*toolbarMarginOffset; 
        toolbar.setLayoutParams(params);
    }
};

我已经包含了 dp 函数来从像素转换为 dp 但显然将其设置为您的工具栏高度。(将 dp(48) 替换为您的工具栏高度)

无论您在哪里设置 RecyclerView,都包括:

yourListView.setOnScrollListener(onScrollListenerToolbarHide);

但是,如果您还使用 SwipeRefreshLayout,还有一些额外的问题。

我不得不将 RecyclerView 的适配器中第一个元素的 marginTop 设置为工具栏的高度加上原始偏移量。(我知道有点黑客)。这样做的原因是我发现如果我更改上面的代码以包括在滚动时更改 recyclerView 的 marginTop ,这是一种紧张的体验。所以我就是这样克服的。所以基本上设置你的布局,使你的工具栏浮动在 RecyclerView 的顶部(剪辑它)像这样的东西(在你的自定义 RecyclerView 适配器的 onBindViewHolder 中):

 if(position==0){
     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
     // params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
     params.topMargin = dp(10+48);
 }

最后,由于 RecyclerViews 刷新圈的偏移量很大,因此您需要对其进行偏移(回到持有 RecyclerView 的类的 onCreate 中):

swipeLayout.setProgressViewOffset(true,dp(48),dp(96));

我希望这可以帮助别人。这是我的第一个详细答案,所以我希望我足够详细。

于 2015-02-22T18:35:00.313 回答
1

要隐藏特定片段的菜单:

 setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:  


   @Override
   public void onPrepareOptionsMenu(Menu menu) {
       menu.findItem(R.id.action_search).setVisible(false);
   }
于 2016-01-07T08:47:48.553 回答
0

我实现了一个实用程序类来在滚动时执行整个隐藏/显示工具栏动画。您可以在此处查看文章http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-android-toolbar-when-scrolling-google-play-musics-behavior/。源代码在这里https://github.com/rylexr/android-show-hide-toolbar

于 2015-06-14T01:19:51.960 回答
0

可以在此处下载包含用于滚动工具栏或任何类型标题的完整源代码的库和演示:

https://github.com/JohannBlake/JBHeaderScroll

Headers 可以是 Toolbars、LinearLayouts、RelativeLayouts 或用于创建标题的任何类型的视图。

可滚动区域可以是任何类型的滚动内容,包括 ListView、ScrollView、WebView、RecyclerView、RelativeLayout、LinearLayout 或任何你想要的。

甚至还支持嵌套标题。

以 Google 报亭中的方式同步标题(工具栏)和可滚动内容确实是一项复杂的工作。

这个库不需要实现任何类型的 onScrollListener。

上面列出的其他解决方案只是半生不熟的解决方案,没有考虑到工具栏下方的可滚动内容区域的顶部边缘必须最初与工具栏的底部边缘对齐,然后在滚动内容区域需要重新定位并可能调整大小。JBHeaderScroll 处理所有这些问题。

于 2015-06-21T07:39:20.387 回答
0

有一个名为 Android Design Support Library 的 Android 库,它是一个方便的库,您可以在其中找到 Material 文档提供的所有这些 Material 奇特设计的东西,而无需告诉您如何去做。

它在这个Android 博客文章中得到了很好的介绍。特别是“折叠工具栏”是您正在寻找的。

于 2015-08-27T16:11:22.673 回答