简单的问题,但我找不到答案。如何通过编程方式折叠或展开CollapsingToolbarLayout
?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
简单的问题,但我找不到答案。如何通过编程方式折叠或展开CollapsingToolbarLayout
?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
使用 Support Library v23,你可以调用 appBarLayout.setExpanded(true/false)
。
AppBarLayout
。还有一个嵌套的 CoordinatorLayout
需要处理。 - IgorGanapolsky我正在使用这段代码来实现可折叠工具栏,但是还没有找到展开它的方法。
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:使用负velocityY的相同函数但工具栏没有展开到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]);
}
}
我会尝试自己实现Behavior。
onNestedFling
的最后一个参数设置为false
,则“Edit 1”也可以正常工作。 - Ricky LeeonNestedFling
方法。设置完碎片后,我成功地调用了这个方法。 - usp您可以使用自定义动画程序来定义它展开或折叠的程度。只需使用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();
}
(-900)
来设置valueAnimator.setIntValues
的值并不是最好的解决方案,更好的方法是使用-(appBar.getTotalScrollRange())
。 - Ali Rezaiyan我写了一个小扩展来改进AppBarLayout
,它可以带有或不带动画来实现CollapsibleToolbarLayout
的展开和折叠。它看起来正常工作。
只需要使用它代替你的AppBarLayout
,并且你可以调用与展开或折叠CollapsingToolbarLayout
相关的方法。
在我的项目中,它完全按照预期运行,但是你可能需要微调在performExpandingWithAnimation()
(特别是在perform...
方法中)的抛掷/滚动值来与你的CollapsibleToolbarLayout
完美匹配。
AppBarLayout
中有了 setExpanded
方法。 - Bartek Lipinski使用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);
对于那些想要使用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);
}
请尝试以下方法...
展开
appBarLayout.setExpanded(true, true);
回顾
appBarLayout.setExpanded(false, true);
通过编程实现展开/折叠AppBarLayout:
fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
appBarLayout.setExpanded(expand, isAnimationEnabled);
}
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);
我一直在使用这个
private fun collapseAppbar() {
scrollView.postDelayed(Runnable {
scrollView?.smoothScrollTo(50, 50)
}, 400)
}
CollapsingToolbarLayout
不能自行展开或折叠的答案感到有些迷茫,更糟糕的是,其他评论让它看起来像是与版本有关的问题。实际上,你需要处理的是它的父级,这很有趣,因为CollapsingToolbarLayout
可以禁用自己的折叠/展开,但出于某种原因它不能触发它们。 - Delark