android棒棒糖工具栏:如何在滚动时隐藏/显示工具栏?

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

据我所知,没有任何内容是为你做的。 但是,您可以看看Google IO源代码,特别是BaseActivity 。 search“自动隐藏”或查看onMainContentScrolled

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

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

如果你想再次展示你的电话:

 toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start(); 

为了隐藏工具栏,你可以这样做:

 getSupportActionBar().hide(); 

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

答案很简单。 只需实现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获得了这个想法;

隐藏:

 getSupportActionBar().hide(); 

显示:

 getSupportActionBar().show(); 

我一直在试图实现相同的行为,这里是代码显示和隐藏工具栏(放入任何包含您的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设置为工具栏的高度加上原始偏移量。 (有点黑客我知道)。 原因是我发现,如果我改变了我的上面的代码,包括更改回滚视图的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的刷新圈会被剪切掉,所以你需要将它抵消掉(回到你的类的onCreate中,持有你的RecyclerView):

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

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

在滚动内容时,实际上有很多方法可以隐藏/显示工具栏。 其中一种方法是通过Androiddevise支持库或者更具体的协调器布局来实现。 超级动力的框架布局。

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

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

我实际上已经做了一个video来解释如何以一步一步的方式完成。 随时检查出来,让我知道是否有帮助。 谢谢! 🙂

https://youtu.be/mEGEVeZK7Nw

我实现了一个实用工具类来滚动时完成隐藏/显示工具栏animation。 你可以在这里看到这篇文章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

可以在这里下载包含滚动工具栏或任何types标题的完整源代码的库和演示:

https://github.com/JohannBlake/JBHeaderScroll

标题可以是工具栏,LinearLayouts,RelativeLayouts或用于创build标题的任何types的视图。

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

甚至还支持嵌套的头文件。

这确实是一个复杂的工作,以在Google报亭中完成的方式来同步标题(工具栏)和可滚动内容。

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

上面列出的解决scheme只是半解决scheme,没有考虑到工具栏下方的可滚动内容区域的顶部边缘必须首先与工具栏的底部边缘alignment,然后在滚动期间内容区域需求重新定位并可能resize。 JBHeaderScroll处理所有这些问题。

有一个名为“Androiddevise支持库”的Android库,它是一个方便的库,您可以在其中find“材料”文档所提供的所有“材料”devise,而不告诉您如何执行这些devise。

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

隐藏特定片段的菜单:

  setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT: @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.action_search).setVisible(false); } 

只需在您的工具栏中添加此属性,并完成

 app:layout_scrollFlags="scroll|enterAlways" 

不是太棒了

Material Design API中的工具栏就像在Android中使用的任何其他VIEW一样…

尝试使用:

 toolbar.setVisibility(View.GONE); 

这对我工作

我还没有animation它的隐藏过程。 那么我认为可以使用Animator实例完成,就像animation一个简单的视图