以编程方式折叠或展开CollapsingToolbarLayout


158

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

折叠的工具栏

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

展开的工具栏


1
我想知道同样的事情。一旦用户单击嵌入式布局(例如图像),将工具栏扩展到全屏也可能很有趣。
莫里茨

Answers:


321

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

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


2
好的,谢谢您的提示,但是支持libs v23的问题非常严重,所以我现在无法测试,因为我需要停留在22.2.1 ....
Tomas

现在您有了23.0.1的一些修复程序
Mario Velasco

6
是否可以使用支持库23.1.1定义自定义动画?setExpanded(boolean,true)具有非常慢的动画...
Nifhel

我有一个问题,其中有一个带有可折叠工具栏和一个recyclerview的布局。从recyclerview删除项目时,工具栏的行为不正常,因此我将扩展应用程序栏的布局,使其正常工作。我最终为动画使用了appBarLayout.setExpanded(true,true)。
雷·亨特

49

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

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%,最后一个参数为false

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确实显示了扩展工具栏中的内容

会尝试自己实施行为。


2
编辑1也将工作,如果你设置的最后一个参数onNestedFlingfalse
Ricky Lee

2
params.getBehavior()返回null。在xml中,layout_behaviour标记是在同级NestedScrollView而不是AppBarLayout上设置的。你能帮助我吗?
User31689 2015年

谢谢。如果最后一个参数为false,则Edit 1正常工作。:)
Sirelon

@GobletSky我遇到了同样的问题。我的片段中有NestedScrollView,并onNestedFling 设置片段之前尝试调用。设置片段后,我可以成功调用该方法。
usp

@usp实际上,我的问题是完全不同的(有点愚蠢的错误)。看到这一点:stackoverflow.com/questions/31067082/...
User31689

27

您可以使用自定义动画器定义其扩展或折叠的程度。只需使用即可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();
}

2
这是唯一使您可以为自定义偏移设置动画的答案。非常感谢!
Guilherme Torres Castro

2
appBar.setExpanded(false,true); (打开/关闭,进行动画处理)您无需编写所有这些行
Puni

2
到@Puni,如果您想扩展/折叠到“自定义”偏移量(例如进行多个阶段的折叠),则需要此功能。
曾其威2017年

如果您不想编写自定义行为,这是为AppBar偏移设置动画的最佳解决方案。对代码段的一种更新是调用带有behavior.topAndBottomOffset起始值而不是0的valueAnimator.setIntValues()来从当前应用栏偏移开始动画。

使用自定义变量( -900 )进行设置更好valueAnimator.setIntValues的解决方案是使用- ( appBar.getTotalScrollRange() )
Ali Rezaiyan,

12

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

随时尝试。

只需使用它代替您的AppBarLayout,就可以调用负责扩展或崩溃的方法CollapsingToolbarLayout

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


@ssdeno请阅读Github要点的Readme.md。从支持库的v23开始不推荐使用。自从v23支持(进入AndroidX版本)以来,中提供了setExpanded方法AppBarLayout
Bartek Lipinski

6

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);

1
这对我很有帮助。
NoName

1
这很有帮助。谢谢!
sunlover3

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);


        }

1

试试这个...

扩大

appBarLayout.setExpanded(true, true);

回想一下

appBarLayout.setExpanded(false, true);

0

这可能有助于扩展或崩溃:

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);

0

我已经用这个

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }

0

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

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.