Программно свернуть или развернуть CollapsingToolbarLayout
простой вопрос, но я не могу найти ответ. Как я могу свернуть или развернуть CollapsingToolbarLayout
программно?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
6 ответов:
используя библиотеку поддержки v23, вы можете вызвать
appBarLayout.setExpanded(true/false)
.читайте далее: AppBarLayout.setExpanded (boolean)
Я использую этот код для сворачивания панели инструментов. До сих пор не могу найти способ расширить его.
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); } }
Edit 1: та же функция с отрицательной скоростью
но панель инструментов не расширена на 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); } }
Edit 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 показывает содержимое внутри расширенного панель инструментов
попытаюсь реализовать поведение самостоятельно.
вы можете определить, насколько он расширяется или сворачивается с помощью пользовательского аниматора. Просто используйте
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(); }
Я написал небольшое расширение для
AppBarLayout
. Это позволяет для расширения и свертыванияCollapsibleToolbarLayout
как с анимацией, так и без нее. Кажется, он делает это совершенно правильно.не стесняйтесь попробовать его.
просто используйте его вместо вашего
AppBarLayout
, и вы можете вызвать методы, ответственные за расширение или сворачиваниеCollapsingToolbarLayout
.он работает точно так, как ожидалось в моем проекте, но вам может потребоваться настроить значения fling / scroll элемент
perform...
методы (особенно вperformExpandingWithAnimation()
), чтобы идеально сочетаться с вашимCollapsibleToolbarLayout
.
для тех, кто хочет работать с onNestedPreScroll и получить ошибку, как я. я получаю NullPointerException в onCreate с этой строкой
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)
свернуть панель инструментов.если вы хотите изменить 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);