以编程方式折叠或展开CollapsingToolbarLayout

简单的问题,但我找不到答案。 如何以编程方式折叠或展开CollapsingToolbarLayout

折叠的工具栏

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

扩展工具栏

使用Support Library v23,你可以调用appBarLayout.setExpanded(true/false)

更多阅读: AppBarLayout.setExpanded(boolean)

我使用这个代码折叠工具栏。 仍然无法find扩展它的方法。

 public void collapseToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true); } } 

编辑1:负velocityY相同的function, 但工具栏不扩大100%和假的最后一个参数应该工作

 public void expandToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false); } } 

编辑2:此代码为我做的伎俩

 public void expandToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.setTopAndBottomOffset(0); behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]); } } 
  • setTopAndBottomOffset展开工具栏
  • onNestedPreScroll在展开的工具栏中显示内容

将尝试自己执行行为。

您可以定义多less扩展或崩溃与您的自定义animation师。 只需使用setTopAndBottomOffset(int)。

这里是一个例子:

 CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams(); final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if (behavior != null) { ValueAnimator valueAnimator = ValueAnimator.ofInt(); valueAnimator.setInterpolator(new DecelerateInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue()); appBar.requestLayout(); } }); valueAnimator.setIntValues(0, -900); valueAnimator.setDuration(400); valueAnimator.start(); } 

我写了一个AppBarLayout的小扩展。 它允许使用和不使用animation来展开和折叠CollapsibleToolbarLayout 。 这似乎是正确的做法。

随意尝试一下。

只需使用它来代替你的AppBarLayout ,你可以调用负责展开或折叠CollapsingToolbarLayout

它的工作方式与我的项目完全一样,但是你可能需要调整perform...方法(特别是在performExpandingWithAnimation() )中的performExpandingWithAnimation() / scroll值来完全符合你的CollapsibleToolbarLayout

对于那些想要使用onNestedPreScroll并获得像我一样的错误的人。 我在onCreate中得到了NullPointerException,并且没有这一行

  CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); //below line params.setBehavior(new AppBarLayout.Behavior() {}); 

并不能正确地与此工作。 但我解决这个问题

在onCreate:

  scrollToolbarOnDelay(); 

和…

  public void scrollToolbarOnDelay() { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar); CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0}); else scrollToolbarOnDelay() } }, 100); } 

使用mAppBarLayout.setExpanded(true)展开工具栏并使用mAppBarLayout.setExpanded(false)折叠工具栏。

如果您想以编程方式更改CollapsingToolbarLayout高度,则只需使用mAppBarLayout.setLayoutParams(params) ;

扩大:

 CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*200; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(true); 

坍方:

 CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*80; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(false);