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

Android 5.0 lollipop android棒棒糖工具栏:如何在滚动时隐藏/显示工具栏?,android-5.0-lollipop,material-design,android-toolbar,Android 5.0 Lollipop,Material Design,Android Toolbar,我正在使用appcompat/support-v7中引入的新工具栏小部件。我想根据用户是否在页面上下滚动来隐藏/显示工具栏,就像在新的谷歌playstore应用程序或报摊应用程序中一样。工具栏小部件中是否内置了此功能,或者我应该将其与FrameLayout和ObservableScrollView结合使用 据我所知,没有任何内置功能可以为您实现这一点。不过,您可以看看Google IO源代码,尤其是。搜索“自动隐藏”或查看onMainContentScrolled 要隐藏工具栏,您可以执行以下操

我正在使用appcompat/support-v7中引入的新工具栏小部件。我想根据用户是否在页面上下滚动来隐藏/显示工具栏,就像在新的谷歌playstore应用程序或报摊应用程序中一样。工具栏小部件中是否内置了此功能,或者我应该将其与FrameLayout和ObservableScrollView结合使用

据我所知,没有任何内置功能可以为您实现这一点。不过,您可以看看Google IO源代码,尤其是。搜索“自动隐藏”或查看
onMainContentScrolled

要隐藏
工具栏
,您可以执行以下操作:

toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
如果要再次显示,请调用:

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

答案很简单。只需实现
OnScrollListener
并在listener中隐藏/显示工具栏。例如,如果您有listview/recyclerview/gridview,那么请遵循以下示例

main活动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;
            }
        }
    };
public RecyclerView.OnScrollListener OnScrollListener=new RecyclerView.OnScrollListener(){
布尔hideToolBar=false;
@凌驾
CrollStateChanged上的公共无效(RecyclerView RecyclerView,int newState){
super.onScrollStateChanged(recyclerView、newState);
if(hideToolBar){
((ActionBarActivity)getActivity()).getSupportActionBar().hide();
}否则{
((ActionBarActivity)getActivity()).getSupportActionBar().show();
}
}
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
如果(dy>20){
hideToolBar=true;
}否则如果(dy<-5){
hideToolBar=假;
}
}
};

我的想法来自:

要隐藏工具栏,您只需执行以下操作:

getSupportActionBar().hide();

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

我一直在尝试实现相同的行为,下面是显示和隐藏工具栏(放在包含RecyclerView的任何类中)的代码的主要部分:

但是,如果同时使用SwipeRefreshLayout,还存在一些其他问题

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

最后,由于存在较大的偏移量,RecyclerViews刷新循环将被剪裁,因此您需要对其进行偏移(回到持有RecyclerViews的类的创建中):


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

我实现了一个实用程序类,用于在滚动时执行整个隐藏/显示工具栏动画。你可以在这里看到这篇文章。源代码在此处。

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

标题可以是工具栏、LinearLayouts、RelativeLayouts或用于创建标题的任何类型的视图

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

<CoordinatorLayout>
   <AppBarLayout>
   </AppBarLayout>
   <NestedScrollView>
   </NestedScrollView>
</CoordinatorLayout>
甚至还支持嵌套标题

像在谷歌报摊上那样同步标题(工具栏)和可滚动内容确实是一项复杂的任务

此库不需要实现任何类型的onScrollListener


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

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

    @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);
        }
}
看这个。

这里有详细的样品。

有一个名为Android设计支持库的Android库,这是一个方便的库,您可以在其中找到材料文档中提供的所有材料奇特的设计内容,而无需告诉您如何操作


这本书很好地介绍了这一点。“折叠工具栏”是您特别需要的。要隐藏特定片段的菜单,请执行以下操作:

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


   @Override
   public void onPrepareOptionsMenu(Menu menu) {
       menu.findItem(R.id.action_search).setVisible(false);
   }
隐藏:

展示:


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

基本上,您所需要做的就是在布局文件中具有以下结构,您应该能够实现您想要的结果

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


只需将此属性添加到工具栏中,即可完成

app:layout_scrollFlags="scroll|enterAlways"

我的回答有帮助吗?如果是这样的话,请接受它,或者问它缺少什么。我还没有试过。我一定会回来的。也在寻找其他人的想法。嗨,nomongo,你找到这个问题的解决方案了吗?在onCreate中,你的工具栏还没有布置好。这就是为什么getBottom返回0,所以没有距离可以设置动画。将OnGlobalLayoutListener添加到工具栏ViewTreeObserver,并在回调中启动动画。别忘了把球拿下来
getSupportActionBar().hide();
getSupportActionBar().show();
<CoordinatorLayout>
   <AppBarLayout>
   </AppBarLayout>
   <NestedScrollView>
   </NestedScrollView>
</CoordinatorLayout>
app:layout_scrollFlags="scroll|enterAlways"