Программное изменение флагов прокрутки Toolbar и CollapsingToolbarLayout

У меня есть одно Android-приложение Activity с множеством фрагментов. Когда я показываю экран списка, я хочу использовать Toolbar со свойством app:layout_scrollFlags="scroll|enterAlways". И в фрагментах деталей я хочу использовать CollapsingToolbarLayout с изображением в нем. Поскольку это одно приложение Activity, у меня есть только один файл Toolbar. Можно ли изменить мой макет программно, чтобы он подходил для обоих случаев?




Ответы (3)


Да. Допустим, вы переходите от фрагмента CollapsingToolbarLayout к фрагменту Toolbar.

  1. Вы сворачиваете свой AppBarLayout, используя AppBarLayout.setExpanded(false);

  2. Вы меняете флаги прокрутки в соответствии с вашими потребностями.

    AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
    p.setScrollFlags(...);
    toolbar.setLayoutParams(p);
    

    То же самое касается CollapsingToolbarLayout, если это необходимо. Я думаю, это должно быть что-то вроде:

    collapsingToolbarParams.setScrollFlags(0); //no flags for ctl
    toolbarParams.setScrollFlags(SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS); //new flags for toolbar
    
person natario    schedule 05.09.2015
comment
У меня также была эта проблема. Кажется, я забыл вызвать метод setLayoutParams(). Спасибо за ответ! - person Mauker; 05.01.2016
comment
setScrollFlags(0) работает нормально, но когда я пытаюсь установить это: params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP); // очистить все флаги прокрутки toolbar.setLayoutParams(params); не работает.. - person iBobb; 13.03.2016

я нашел это работающим

public void disableToolBarScrolling() {
    CollapsingToolbarLayout toolbar = findViewById(R.id.collap_toolbar);
    AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
    params.setScrollFlags(0);
}

public void enableToolBarScrolling() {
    CollapsingToolbarLayout toolbar = findViewById(R.id.collap_toolbar);
    AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
    params.setScrollFlags(SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS);
}
person Vivek Pratap Singh    schedule 18.11.2019

Работает на меня.

public void enableToolBarScrolling(CollapsingToolbarLayout toolbar) {
    AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
    params.setScrollFlags(SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS);
    toolbar.setLayoutParams(params);
}
person Julio Cesar    schedule 17.03.2021