Программно свернуть или развернуть CollapsingToolbarLayout

Простой вопрос, но я не могу найти ответ. Как я могу свернуть или развернуть CollapsingToolbarLayout программно?

Свернутая панель инструментов

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

Расширенная панель инструментов

Используя библиотеку поддержки 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); } } 

Редактировать 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 показать содержимое внутри расширенной панели инструментов

Постарайтесь самостоятельно реализовать Поведение.

Я написал небольшое расширение для AppBarLayout . Он позволяет расширять и сворачивать CollapsibleToolbarLayout как с анимацией, так и без нее. Кажется, он делает это совершенно правильно.

Не стесняйтесь попробовать.

Просто используйте его вместо AppBarLayout , и вы можете вызвать методы, ответственные за расширение или свертывание CollapsingToolbarLayout .

Он работает точно так, как ожидалось в моем проекте, но вам может потребоваться настроить значения performExpandingWithAnimation() / scroll в методах perform... (особенно в performExpandingWithAnimation() ), чтобы идеально вписаться с вашим CollapsibleToolbarLayout .

Вы можете определить, насколько он расширяется или сворачивается с вашим пользовательским аниматором. Просто используйте 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 и получить ошибку, как я. Я получаю NullPointerException в onCreate с этой строкой

  CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); //below line params.setBehavior(new AppBarLayout.Behavior() {}); 

И не работает должным образом с этим. Но я обойду эту проблему с

In 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 height, просто используйте mAppBarLayout.setLayoutParams(params) ;

Expand:

 CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*200; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(true); 

Collapse:

 CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*80; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(false); 
Intereting Posts