177

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

折叠的工具栏

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓</p>

扩展工具栏

4

10 回答 10

361

使用支持库 v23,您可以调用appBarLayout.setExpanded(true/false).

进一步阅读:AppBarLayout.setExpanded(boolean)

于 2015-08-21T09:43:28.997 回答
48

我使用此代码折叠工具栏。仍然找不到扩展它的方法。

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:具有负速度Y但工具栏未扩展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 确实显示扩展工具栏内的内容

将尝试自己实现行为。

于 2015-06-10T04:45:12.533 回答
32

您可以使用自定义动画师定义它的扩展或折叠程度。只需使用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();
}
于 2016-04-05T02:19:41.210 回答
12

我写了一个小扩展AppBarLayout。它允许在CollapsibleToolbarLayout有和没有动画的情况下展开和折叠。它似乎做得很正确。

随意尝试一下。

只需使用它代替您的AppBarLayout,您就可以调用负责扩展或折叠CollapsingToolbarLayout.

它在我的项目中完全按预期工作,但您可能需要调整perform...方法中的投掷/滚动值(尤其是在 中performExpandingWithAnimation())以完全适合您的CollapsibleToolbarLayout.

于 2015-06-23T08:50:37.157 回答
8

用于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);
于 2017-03-24T04:12:13.853 回答
5

对于那些想要使用 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);


        }
于 2016-04-18T04:40:15.923 回答
4

尝试这个...

扩张

appBarLayout.setExpanded(true, true);

回忆

appBarLayout.setExpanded(false, true);
于 2019-05-13T05:38:36.217 回答
1

以编程方式展开/折叠 AppBarLayout:

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
于 2019-11-20T11:08:36.553 回答
0

我用过这个

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }
于 2019-05-15T15:58:36.373 回答
0

这可能有助于展开或折叠:

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);
于 2019-02-01T11:42:28.850 回答