Intereting Posts
Не удалось настроить LocalContainerEntityManagerFactoryBean из @EntityScan, убедиться, что соответствующий компонент зарегистрирован Установка приложения программно из Android-источника FindFragmentByTag () возвращает null после выполнения FragmentTransaction с использованием метода replace () Android – getTabHost () не определен Как получить карту Google apikey в android Создание bodyless деятельности Класс данных Котлина RealmObject Выровнять указатель стрелки справа от выбранного в данный момент элемента Ошибка записи видеороликов Фильтрация ListFragment из ActionBar в родительской активности Как создать панель кнопок верхнего или нижнего колонтитула для приложения для Android Как отобразить кнопку при длинном нажатии элемента списка Является ли это хорошей методикой (использование держателя данных) для устранения анонимного класса, чтобы уменьшить риск утечки памяти Пользовательский SwitchPreference в Android Определите, если панель действий разделена

Программно свернуть или развернуть 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);