web-dev-qa-db-fra.com

Nécessité de désactiver le développement de CollapsingToolbarLayout pour certains fragments

J'ai un AppCompatActivity qui contrôle le remplacement de nombreux fragments. Voici ma mise en page pour cela.

activity_main.xml

<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer_layout"
Android:layout_height="match_parent"
Android:layout_width="match_parent"
Android:fitsSystemWindows="true">

<include layout="@layout/activity_main_frame"/>

<Android.support.design.widget.NavigationView
    Android:id="@+id/navigation_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    Android:background="@color/white"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/drawer"/>

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

activity_main_frame.xml

<Android.support.design.widget.CoordinatorLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/main_content"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true">

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/appbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        Android:fitsSystemWindows="true">

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsing_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            Android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="64dp">

            <ImageView
                Android:id="@+id/backdrop"
                Android:layout_width="match_parent"
                Android:layout_height="256dp"
                Android:scaleType="centerCrop"
                Android:fitsSystemWindows="true"
                app:layout_collapseMode="parallax" />

            <include layout="@layout/activity_main_items"/>

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_collapseMode="pin"/>

            <Android.support.design.widget.TabLayout
                Android:id="@+id/tabs"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:visibility="gone"
                Android:layout_gravity="bottom"/>

        </Android.support.design.widget.CollapsingToolbarLayout>

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

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

    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab1"
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"
        app:borderWidth="0dp"
        Android:src="@drawable/app_ic_slide_wallpaper_dark"
        Android:layout_margin="@dimen/big_padding"
        Android:clickable="true"/>

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

Mon fragment home est défini initialement et c’est là que je veux que la barre d’outil se réduise et que cela fonctionne correctement. Cependant, lorsque je change de fragments du tiroir latéral, je souhaite désactiver la barre d’outils en expansion. 

J'ai compris comment le réduire lorsqu'un élément du tiroir est sélectionné, mais je dois également m'assurer qu'il ne se développe pas, sauf si le fragment home est affiché. Est-ce possible?

public void collapseToolbar(){
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
        behavior = (AppBarLayout.Behavior) params.getBehavior();
        if(behavior!=null) {
            behavior.onNestedFling(coordinator, appbar, null, 0, 10000, true);
        }
    }
49
Bignadad

Maintenant, dans la bibliothèque de support v23, vous pouvez facilement contrôler la visibilité de votre barre d’application.

Obtenez simplement une référence à votre AppBarLayout et masquez-la/l'afficher en fonction du fragment que vous voulez charger:

private AppBarLayout appBarLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
[...]
appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
[...]
}

public void switchToFragment(Fragment fragment, String tag, boolean expandToolbar){
        FragmentManager fragmentManager = getSupportFragmentManager();

        Fragment currentFragment = fragmentManager.findFragmentByTag(currentFragmentTag);

        if(currentFragment == null || !TextUtils.equals(tag, currentFragmentTag) ){
            currentFragmentTag = tag;
            fragmentManager
                    .beginTransaction()
                    .replace(R.id.flContent, fragment, currentFragmentTag)
                    .commit();

            if(expandToolbar){
                appBarLayout.setExpanded(true,true);
            }else{
                appBarLayout.setExpanded(false,true);
            }
        }
    }

P.S. n'oubliez pas d'ajouter les dépendances requises dans votre build.gradle:

dependencies {  
    compile 'com.Android.support:design:23.2.1'
    compile 'com.Android.support:appcompat-v7:23.2.1'
    compile 'com.Android.support:recyclerview-v7:23.2.1' 
}

EDIT: Si vous souhaitez également verrouiller votre barre d’outils dans certains fragments (en dehors de la réduction), vous devez recourir à des solutions de contournement car cette fonctionnalité n’est pas fournie par CollapsingToolbarLayout jusqu’à présent (version de support 23.2.1). Ici vous pouvez trouver ma solution de contournement proposée.

18
Sevle

Désactivez le défilement imbriqué sur le contenu du fragment défilant:

recyclerView.setNestedScrollingEnabled(false);

Utilisez ceci si vous utilisez la bibliothèque de support:

ViewCompat.setNestedScrollingEnabled(recyclerView, false);
56
tachyonflux

Cette classe vous permettra de désactiver/réactiver le comportement d'expansion.

public class DisableableAppBarLayoutBehavior extends AppBarLayout.Behavior {
    private boolean mEnabled;

    public DisableableAppBarLayoutBehavior() {
        super();
    }

    public DisableableAppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setEnabled(boolean enabled) {
        mEnabled = enabled;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes) {
        return mEnabled && super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes);
    }

    public boolean isEnabled() {
        return mEnabled;
    }
}

Utilisez-le dans votre mise en page comme suit:

<Android.support.design.widget.AppBarLayout
    ... other attributes ...
    app:layout_behavior="com.yourpackage.DisableableAppBarLayoutBehavior"
    >
    <!-- your app bar contents -->
</Android.support.design.widget.AppBarLayout>

Ensuite, lorsque vous souhaitez désactiver le comportement:

AppBarLayout myAppBar = ....;
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) myAppBar.getLayoutParams();
((DisableableAppBarLayoutBehavior) layoutParams.getBehavior()).setEnabled(false);
32
JasonWyatt

Tout ce que vous avez à faire est de remplacer CoordinatorLayout par une implémentation personnalisée de CoordinatorLayout, qui évitera que le défilement imbriqué ait été traité.

Implémentation de MyCoordinatorLayout:

public class MyCoordinatorLayout extends CoordinatorLayout {

    private boolean allowForScroll = false;

    public MyCoordinatorLayout(Context context) {
        super(context);
    }

    public MyCoordinatorLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
        return allowForScroll && super.onStartNestedScroll(child, target, nestedScrollAxes);
    }

    public boolean isAllowForScroll() {
        return allowForScroll;
    }

    public void setAllowForScroll(boolean allowForScroll) {
        this.allowForScroll = allowForScroll;
    }
}

vue d'activité xml:

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    >

    <Android.support.v4.widget.DrawerLayout
        Android:id="@+id/drawerLayout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        >

        <!--CONTENT-->

        <com.example.views.MyCoordinatorLayout
            Android:id="@+id/coordinator"
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:app="http://schemas.Android.com/apk/res-auto"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:fitsSystemWindows="true"
            >

        <com.example.views.ControllableAppBarLayout
            Android:id="@+id/appbar"
            Android:layout_width="match_parent"
            Android:layout_height="192dp"
            Android:fitsSystemWindows="true"
            Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <Android.support.design.widget.CollapsingToolbarLayout
                Android:id="@+id/collapsing_toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginBottom="32dp"
                app:expandedTitleMarginEnd="64dp"
                app:expandedTitleMarginStart="48dp"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <ImageView
                    Android:id="@+id/header"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:background="@color/primary"
                    Android:fitsSystemWindows="true"
                    Android:scaleType="centerCrop"
                    app:layout_collapseMode="parallax" />

                <Android.support.v7.widget.Toolbar
                    Android:id="@+id/toolbar"
                    Android:layout_width="match_parent"
                    Android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

            </Android.support.design.widget.CollapsingToolbarLayout>

        </com.example.views.ControllableAppBarLayout>

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

        </com.example.views.MyCoordinatorLayout>


        <!-- DRAWER -->

        <fragment
            Android:id="@+id/fDrawer"
            Android:name="com.example.fragment.DrawerFragment"
            Android:layout_width="@dimen/drawer_width"
            Android:layout_height="match_parent"
            Android:layout_gravity="left|start"
            Android:fitsSystemWindows="true"
            Android:clickable="true"
            />

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

</LinearLayout>

Je vous encourage à utiliser une implémentation AppBarLayout personnalisée avec des méthodes d'assistance pour réduire/développer la barre d'outils. Sur ce Gist vous pouvez en trouver un.

Ok, il est maintenant temps de configurer notre barre d’outils en activité.

public class ToolbarAppcompatActivity extends AppCompatActivity
        implements AppBarLayout.OnOffsetChangedListener {

    protected Toolbar toolbar;
    protected MyCoordinatorLayout coordinator;
    protected ControllableAppBarLayout appbar;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        configureToolbar();
    switchFragment(new FooFragment(), "FOO", true);
    }

    protected void configureToolbar() {
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        coordinator = (MyCoordinatorLayout) findViewById(R.id.coordinator);
        appbar = (ControllableAppBarLayout) findViewById(R.id.appbar);
        appbar.addOnOffsetChangedListener(this);
        getDelegate().setSupportActionBar(toolbar);
    }

    public void switchToFragment(Fragment fragment, String tag, boolean expandToolbar){
        FragmentManager fragmentManager = getSupportFragmentManager();

        Fragment currentFragment = fragmentManager.findFragmentByTag(currentFragmentTag);

        if(currentFragment == null || !TextUtils.equals(tag, currentFragmentTag) ){
            currentFragmentTag = tag;
            fragmentManager
                    .beginTransaction()
                    .replace(R.id.flContent, fragment, currentFragmentTag)
                    .commit();

            if(expandToolbar){
                expandToolbar();
            }else{
                collapseToolbar();
            }
        }
    }

    protected void addFragment(Fragment fragment, String tag, boolean expandToolbar) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        currentFragmentTag = tag;
        fragmentManager
                .beginTransaction()
                .add(R.id.flContent, fragment, currentFragmentTag)
                .addToBackStack(tag)
                .commit();

        if(expandToolbar){
            expandToolbar();
        }else{
            collapseToolbar();
        }
    }

   protected void collapseToolbar(){
        appbar.collapseToolbar();
        coordinator.setAllowForScroll(false);
    }

    public void expandToolbar(){
        appbar.expandToolbar();
        coordinator.setAllowForScroll(true);
    }

}

Chaque fois que vous voulez changer de fragment et réduire/étendre la barre d’outils, simplement Appelez la méthode switchFragment/addFragment avec le paramètre booléen approprié.

Juste une dernière note. Assurez-vous d'utiliser les dernières bibliothèques de support.

dependencies {

    // Android support
    compile 'com.Android.support:appcompat-v7:22.2.1'
    compile 'com.Android.support:recyclerview-v7:22.2.1'
    compile 'com.Android.support:design:22.2.1'

}

N'utilisez pas la balise include dans AppBarLayout. Ça ne marche pas

11
Lucy Fair

Avec Android Design Library v23.1.1, la méthode décrite par @LucyFair ne fonctionne pas. J'ai réussi à le faire fonctionner en réglant le app:layout_scrollFlags surenterAlwaysCollapsedonly, et la barre d'applications reste "verrouillée".

J'espère que cela t'aides. :)

5
StrangeCode

J'ai trouvé une solution simple pour activer/désactiver la réduction dans CollapsingToolbarLayout:

    private void setExpandEnabled(boolean enabled) {
        mAppBarLayout.setExpanded(enabled, false);
        mAppBarLayout.setActivated(enabled);
        final AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
        if (enabled)
            params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
        else
            params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
        collapsingToolbarLayout.setLayoutParams(params);
    }
4
Dmitry Velychko

J'ai utilisé la solution de @JasonWyatt et ajouté DragCallback à la classe de comportement pour empêcher tout contact et glisser CollapsingToolbarLayout

private void setDragCallback() {
    setDragCallback(new DragCallback() {
        @Override
        public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
            return mEnabled;
        }
    });
}
3
Duev S.

J'ai trouvé une solution de contournement qui fonctionne avec l'activité et divers fragments. Vous implémentez CollapsingToolbarLayout avec AppBar, etc. dans votre activité, puis chaque fois que vous appelez un nouveau fragment, vous pouvez appeler ces 2 fonctions.

  • Lorsque je veux que ma barre d’application reste réduite:

    public void lockAppBarClosed() {
        mAppBarLayout.setExpanded(false, false);
        mAppBarLayout.setActivated(false);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_height);
    }
    
  • Quand je veux que ma barre d’applications soit étendue et puisse défiler à nouveau

    public void unlockAppBarOpen() {
        mAppBarLayout.setExpanded(true, false);
        mAppBarLayout.setActivated(true);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_expand_height);
    }
    

Vous pouvez appeler ces fonctions à partir de vos fragments en implémentant une interface. Voici un exemple rapide pour votre cas (la barre d'outils ne se développe que dans homeFragment)

public interface CustomListener() {
    void unlockAppBarOpen();
    void lockAppBarClosed()
}

public class MainActivity extends BaseActivity implements CustomListener {

    @Override
    public void unlockAppBarOpen() {
        mAppBarLayout.setExpanded(true, false);
        mAppBarLayout.setActivated(true);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_expand_height);
    }

    @Override
    public void lockAppBarClosed() {
        mAppBarLayout.setExpanded(false, false);
        mAppBarLayout.setActivated(false);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)mAppBarLayout.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_height);
    }
}

public class MainFragment extends BaseFragment {

    @Override
    public void onResume() {
        super.onPause();
        ((MainActivity) getContext()).unlockAppBarOpen();
    }
}

public class SecondFragment extends BaseFragment {

    @Override
    public void onResume() {
        super.onPause();
        ((MainActivity) getContext()).lockAppBarClosed();
    }
}

Avec cet exemple:

  • chaque fois que MainFragment sera affiché -> il étendra la barre d’outils et le rendra repliable et extensible

  • chaque fois que SecondFragment est affiché -> il réduira la barre d'outils à une taille standard et l'empêchera de se développer à nouveau

J'espère que cela vous aidera!

2
Anne-Claire

Je ne peux pas commenter, je vais donc publier mes ajouts à la solution JasonWyatt DisableableAppBarLayoutBehavior en tant que réponse indépendante.

public class DisableableAppBarLayoutBehavior extends AppBarLayout.Behavior {
    private boolean mEnabled = true; // enabled by default

    public DisableableAppBarLayoutBehavior() {
        super();
    }

    public DisableableAppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setEnabled(boolean enabled) {
        mEnabled = enabled;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) {
        return mEnabled && super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type);
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
        if (!isEnabled()) return;
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
        if (!isEnabled()) return;
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
    }

    public boolean isEnabled() {
        return mEnabled;
    }
}

En plus de onStartNestedScroll, verrouillez également onNestedPreScroll et onNestedScroll lui-même pour éviter tout comportement inattendu. Par exemple, dans mon cas, appeler setExpanded (false, true) sur la barre d’application freine le comportement attendu et continue de s’étendre avec des retards. Maintenant ça marche:

LayoutParams layoutParams = (LayoutParams) context.appBarLayout.getLayoutParams();
((DisableableAppBarLayoutBehavior)layoutParams.getBehavior()).setEnabled(false);
context.appBarLayout.setLayoutParams(layoutParams);
context.appBarLayout.setExpanded(false, true); // collapse app bar
1
ekar

Aucune des solutions fournies n'a fonctionné pour moi, sauf celui-ci. Avec cette solution, je peux facilement gérer l’état de la barre d’outil qui s’effondre. Cela empêchera l'expansion de la barre d'outils réductrice et définira le titre pour celle-ci.

public void lockAppBar(boolean locked,String title) {
    if(locked){
        appBarLayout.setExpanded(false, true);
        int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics());
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams();
        lp.height = px;
        appBarLayout.setLayoutParams(lp);
        collapsingToolbarLayout.setTitleEnabled(false);
        toolbar.setTitle(title);
    }else{
        appBarLayout.setExpanded(true, false);
        appBarLayout.setActivated(true);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.toolbarExpandHeight);
        collapsingToolbarLayout.setTitleEnabled(true);
        collapsingToolbarLayout.setTitle(title);
    }
}
0
Kemal

Trouvez l'ID AppBarLayout comme ceci.

appBarLayout = (AppBarLayout) findViewById(R.id.appbar);

Désactiver le développement de CollapsingToolbarLayout pour certains fragments

appBarLayout.setExpanded(true,true);

Activer le développement de CollapsingToolbarLayout pour certains fragments

appBarLayout.setExpanded(false,true);

J'espère que cela vous aidera!

0
Praveen Kumar Verma

Vous pouvez verrouiller le développement d’appbarlayout en réinitialisant la hauteur de la barre d’outils en une barre

toolbarHeight = toolbar.getLayoutParams().height;

if (expand) {
    collapsingToolbar.getLayoutParams().height = getResources().getDimensionPixelOffset(R.dimen.collapsingToolbarDefaultHeight);
    appBarLayout.setExpanded(true, true);
} else {
    //collapse
    //** it is important you do this before resetting **
    appBarLayout.setExpanded(false, true);
    appBarLayout.postDelayed(new Runnable() {
        @Override
        public void run() {
            collapsingToolbar.getLayoutParams().height = toolbarHeight;
        }
     }, 700/* 600 is default animation time to collapse */);
}
0
Pushan

Le code suivant atteint 3 objectifs:

Désactivez CollapsingToolbarLayout développer ou réduire par l'utilisateur, mais toujours autoriser AppBarLayout.setExpanded.

Empêchez le défilement de RecyclerView ou NestedScrollView de développer ou de réduire CollapsingToolbarLayout.

// scrollView can be RecyclerView or NestedScrollView
ViewCompat.setNestedScrollingEnabled(scrollView, false)

Empêchez l'utilisateur de développer ou de réduire CollapsingToolbarLayout en faisant glisser la barre des tâches.

val params = appBar.layoutParams as CoordinatorLayout.LayoutParams
if (params.behavior == null)
    params.behavior = AppBarLayout.Behavior()
val behaviour = params.behavior as AppBarLayout.Behavior
behaviour.setDragCallback(object : AppBarLayout.Behavior.DragCallback() {
    override fun canDrag(appBarLayout: AppBarLayout): Boolean {
        return false
    }
})

https://code.luasoftware.com/tutorials/Android/how-to-disable-or-lock-collapsingtoolbarlayout-collapse-or-expand/

0
Desmond Lua