【问题标题】:Programmatically collapse or expand CollapsingToolbarLayout以编程方式折叠或展开 CollapsingToolbarLayout
【发布时间】:2015-08-19 18:41:37
【问题描述】:

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

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

【问题讨论】:

  • 我也在想同样的事情。一旦用户单击嵌入式布局(例如图像),将工具栏扩展到全屏也可能很有趣。
  • 我对答案有点迷茫,这些答案忽略了CollapsingToolbarLayout 无法展开或折叠本身的事实,最糟糕的是,其他 cmets 看起来好像是与版本有关的问题,实际上您需要处理的是它的父级,这很有趣,因为CollapsingToolbarLayout CAN disable 它自己的折叠/扩展,但是由于某种原因,它无法触发它们。

标签: android android-collapsingtoolbarlayout


【解决方案1】:

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

延伸阅读:AppBarLayout.setExpanded(boolean)

【讨论】:

  • 好的,谢谢你的提示,但是支持库 v23 有很多错误,所以我现在无法测试它,因为我需要留在 22.2.1....
  • 现在你有一些修复的 23.0.1
  • 是否可以使用支持库 23.1.1 定义自定义动画? setExpanded(boolean, true) 有一个非常慢的动画...
  • 我遇到了一个问题,我的布局带有一个可折叠的工具栏和一个 recyclerview。从 recyclerview 中删除项目时,工具栏的行为不正常,所以我会扩展应用栏布局并且它工作正常。我最终为动画使用了 appBarLayout.setExpanded(true, true)。
  • 这只是部分展开/折叠AppBarLayout。还有一个嵌套的CoordinatorLayout 需要处理。
【解决方案2】:

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

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 会显示扩展工具栏内的内容

将尝试自己实现 Behavior。

【讨论】:

  • 如果您将onNestedFling的最后一个参数设置为false,编辑1也将起作用。
  • params.getBehavior() 返回 null。在 xml 中,layout_behaviour 标记设置在同级 NestedScrollView 上,而不是 AppBarLayout。你能帮帮我吗?
  • 谢谢。如果最后一个参数为假,编辑 1 可以正常工作。 :)
  • @GobletSky 我遇到了同样的问题。我的片段中有 NestedScrollView 并尝试调用onNestedFling before 设置片段。设置好fragment后,就可以成功调用方法了。
  • @usp 实际上,我的问题完全不同(有点愚蠢的错误)。看到这个:stackoverflow.com/questions/31067082/…
【解决方案3】:

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

【讨论】:

  • 这是唯一真正让您动画到自定义偏移的答案。非常感谢!
  • appBar.setExpanded(false, true); (打开/关闭,动画)你不需要写所有这些行
  • 致@Puni,如果您想展开/折叠到“自定义”偏移量(例如进行多阶段折叠),您将需要这个。
  • 这是动画 AppBar 偏移的最佳解决方案,以防您不想编写自定义行为。对代码 sn-p 的一项更新是调用 valueAnimator.setIntValues() 并使用 behavior.topAndBottomOffset 起始值而不是 0 来从当前 appbar 偏移量开始动画。
  • 使用自定义变量( -900 )设置valueAnimator.setIntValues更好的解决方案是使用- ( appBar.getTotalScrollRange() )
【解决方案4】:

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

Feel free to try it out.

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

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

【讨论】:

  • @ssdeno 请阅读 Github 要点的 Readme.md。自支持库的 v23 以来,它已被弃用。从支持的 v23 开始(继续 AndroidX),AppBarLayout 中有setExpanded 方法。
【解决方案5】:

使用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】:

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

    【讨论】:

      【解决方案7】:

      试试这个...

      展开

      appBarLayout.setExpanded(true, true);
      

      回忆

      appBarLayout.setExpanded(false, true);
      

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

            我用过这个

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-05-07
              • 2012-07-01
              • 1970-01-01
              • 2016-08-29
              • 2011-07-06
              • 2014-12-18
              • 1970-01-01
              • 2018-06-17
              相关资源
              最近更新 更多