How to enable/disable toolbar scrolling programmatically when using design support library
Asked Answered
P

2

41

I use support design library to show/hide toolbar when scrolling a recyclerView inside a fragment, as mention here https://github.com/codepath/android_guides/wiki/Handling-Scrolls-with-CoordinatorLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:layout_scrollFlags="scroll|enterAlways"/>

        </android.support.design.widget.AppBarLayout>


        <FrameLayout
            android:id="@+id/flContent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="@dimen/fab_margin"
            android:src="@android:drawable/ic_dialog_email" />

    </android.support.design.widget.CoordinatorLayout>


    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

It works grate, Now I want to enable/disable toolbar scrolling programmatically because I use fragments and I need to stop this feature for some fragments.

Pickerel answered 14/10, 2015 at 14:12 Comment(0)
A
73

The Toolbar, being a child of the AppBarLayout, gets its LayoutParams from the AppBarLayout. These layout params have the scroll flags that are set in the XML.

So, you get the AppBarLayout.LayoutParams from the Toolbar, and call setScrollFlags() to change the flags to the value you want.

    Toolbar toolbar = findViewById(R.id.toolbar);  // or however you need to do it for your code
    AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
    params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL);  // clear all scroll flags
Adeliaadelice answered 14/10, 2015 at 14:33 Comment(7)
And to add the scrolling back at runtime, use the same method with the constants from hereMani
I want the same behavior. It worked but the problem I'm having is that, when I set the flags to 0, the nestedScrollView's height is reduced and it creates a huge blank space at the bottom of the content. Please help if someone knows about it.Aureolin
@VineetAshtekar You could try taking the appbar_scrolling_view_behavior off the NestedScrollView at the same time. Since the toolbar can no longer scroll, there's no reason to lay out the NestedScrollView as if it can. I don't know exactly how to do that programmatically; I am looking into it.Adeliaadelice
I'm using the same lines of code to change the scroll flags of my CollapsingToolbarLayout. But I need to trigger this code when AppBarLayout is touched by the user. However, my issue is that the changing scroll flags would be effective until I release the touch. Any ideas to change the scroll flags immediately while the user still touching the AppBarLayout?Cardie
Never mind. I was able to fix the above issue by programmatically adding fake ACTION_CANCEL and ACTION_DOWN events after changing scroll flags.Cardie
For some reason this is not working for me when I'm using a RecyclerView.Mani
After support 25.3.1, it need to invoke appBarLayout.requestLayout() to take effects.Pacifa
F
12

Remove app:layout_scrollFlags="scroll|enterAlways" wherever you want to disable taskbar scrolling.

Fowlkes answered 14/10, 2015 at 14:23 Comment(2)
I would like to do it programmaticallyPickerel
You can set it like this if you want it disabled in xml: app:layout_scrollFlags="enterAlwaysCollapsed"Fanaticism

© 2022 - 2024 — McMap. All rights reserved.