以编程方式折叠或展开折叠工具栏布局

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

collapsed toolbar

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

expanded toolbar

102499 次浏览

我使用这个代码来折叠工具栏。仍然找不到一种方法来展开它。

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: 相同的函数与负速度 但是工具栏没有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 确实显示了展开的工具栏中的内容

将尝试自己实现行为。

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

延伸阅读: SetExpated (boolean)

可以使用自定义动画器定义它的展开或折叠程度。 用 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();
}

对于那些想要使用 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)折叠“工具栏”。

如果你想改变 折叠工具栏布局高度编程,然后只是使用 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);

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

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

试试这个..。

扩张

appBarLayout.setExpanded(true, true);

回忆

appBarLayout.setExpanded(false, true);

我用过这个

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

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

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