以编程方式折叠或展开CollapsingToolbarLayout

时间:2015-06-04 23:33:18

标签: android android-collapsingtoolbarlayout

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

collapsed toolbar

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

expanded toolbar

10 个答案:

答案 0 :(得分:281)

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

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

答案 1 :(得分: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%并且最后一个参数的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 :(得分:22)

您可以使用自定义动画制作工具定义它展开或折叠的程度。 只需使用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();
}

答案 3 :(得分:12)

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

Feel free to try it out.

只需使用它而不是AppBarLayout,您就可以调用负责展开或折叠CollapsingToolbarLayout的方法。

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

答案 4 :(得分: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);


        }

答案 5 :(得分:4)

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

答案 6 :(得分:0)

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

<div class="hero_image">
  <h1>Heading <br>more text <br>last bit of text</h1>
</div>

答案 7 :(得分:0)

尝试一下...

展开

appBarLayout.setExpanded(true, true);

要回忆

appBarLayout.setExpanded(false, true);

答案 8 :(得分:0)

我正在使用此

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

答案 9 :(得分:0)

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

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}