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

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

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

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

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

11 ответов

Решение

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

Дальнейшее чтение: AppBarLayout.setExpanded (логическое)

Я использую этот код для сворачивания панели инструментов. До сих пор не могу найти способ расширить его.

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

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

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

Использование 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);

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


        }

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

Развернуть

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)
    }

Убедитесь, что ваш родитель является макетом координатора, иначе setExpanded не будет работать.

Другие вопросы по тегам