Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@chrisbanes
Last active January 6, 2024 10:10
Show Gist options
  • Save chrisbanes/8391b5adb9ee42180893300850ed02f2 to your computer and use it in GitHub Desktop.
Save chrisbanes/8391b5adb9ee42180893300850ed02f2 to your computer and use it in GitHub Desktop.
Fixed AppBarLayout.Behavior for https://issuetracker.google.com/66996774
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package your.package;
import android.content.Context;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
/**
* Workaround AppBarLayout.Behavior for https://issuetracker.google.com/66996774
*
* See https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2 for
* example usage.
*
* Change the package name as you wish.
*/
public class FixAppBarLayoutBehavior extends AppBarLayout.Behavior {
public FixAppBarLayoutBehavior() {
super();
}
public FixAppBarLayoutBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target,
int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed,
dxUnconsumed, dyUnconsumed, type);
stopNestedScrollIfNeeded(dyUnconsumed, child, target, type);
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
View target, int dx, int dy, int[] consumed, int type) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
stopNestedScrollIfNeeded(dy, child, target, type);
}
private void stopNestedScrollIfNeeded(int dy, AppBarLayout child, View target, int type) {
if (type == ViewCompat.TYPE_NON_TOUCH) {
final int currOffset = getTopAndBottomOffset();
if ((dy < 0 && currOffset == 0)
|| (dy > 0 && currOffset == -child.getTotalScrollRange())) {
ViewCompat.stopNestedScroll(target, ViewCompat.TYPE_NON_TOUCH);
}
}
}
}
AppBarLayout abl = findViewById(R.id.app_bar);
((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).setBehavior(new FixAppBarLayoutBehavior());
<android.support.design.widget.CoordinatorLayout 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.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_height="..."
android:layout_width="..."
app:layout_behavior="your.package.FixAppBarLayoutBehavior">
</android.support.design.widget.AppBarLayout>
<!-- Content -->
</android.support.design.widget.CoordinatorLayout>
@shubhamvashisht
Copy link

Am having same issue with BottomSheetBehavior, any fix for that?

@harsha-main
Copy link

Why isn't this incorporated in the official release so far? I have a Horizontal recyclerview inside a vertical recyclerview, which is inside a nestedscrollview. I'm now having issues with the usability of the horizontal scroll. It works very different from the Google Play app, which has good UX, I need to know if there's a standard solution for this provided by Android.

@geoff-powell
Copy link

geoff-powell commented Jun 21, 2019

@harsha-main I have the same layout with horizontal recycler inside a vertical recycler inside a coordinator layout. One think that fixed my issues with the app bar layout was setting android:nestedScrollEnabled="false" on the horizontal recycler. It fixed our issues with our collapsing header so it might fix your issues.

@allenjy
Copy link

allenjy commented Oct 23, 2019

Thanks!!!

@Ekt0s
Copy link

Ekt0s commented Nov 19, 2019

Thanks Chris ! 🙌

@fjz97
Copy link

fjz97 commented Jan 10, 2020

Thanks!

@jesselima
Copy link

Oh God!!!
Finaly!!!
Thanks!!!!

@sajjadyousefnia
Copy link

sajjadyousefnia commented May 26, 2020

doesn't work for me, crashes!.

@boylenssen
Copy link

Seems to be solved in the latest version of AndroidX dependencies

@yummyChina
Copy link

doesn't work for me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment