Подтвердить что ты не робот

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

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

collapsed toolbar

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

expanded toolbar

4b9b3361

Ответ 1

Используя библиотеку поддержки v23, вы можете вызвать appBarLayout.setExpanded(true/false).

Дальнейшее чтение: AppBarLayout.setExpanded(boolean)

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

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

Ответ 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();
}

Ответ 4

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

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

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

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

Ответ 5

для тех, кто хочет работать с 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);


        }

Ответ 6

Используйте mAppBarLayout.setExpanded(true), чтобы развернуть панель инструментов и использовать mAppBarLayout.setExpanded(false), чтобы свернуть панель инструментов.

Если вы хотите программно изменить высоту CollapsingToolbarLayout, тогда просто используйте 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);

Ответ 7

Это может помочь расширить или свернуть:

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

Ответ 8

Попробуй это...

расширять

appBarLayout.setExpanded(true, true);

Перезвонить

appBarLayout.setExpanded(false, true);

Ответ 9

я использую это

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