Я не помню, откуда я это взял, но он прекрасно работает для меня.Это пользовательское поведение для AppBarLayout:
public class LockableAppBarLayoutBehavior extends AppBarLayout.Behavior {
boolean locked;
private DragCallback dragCallBack = new DragCallback() {
@Override
public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
return !locked;
}
};
public LockableAppBarLayoutBehavior() {
setDragCallback(dragCallBack);
}
public LockableAppBarLayoutBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
setDragCallback(dragCallBack);
}
public void setLocked(boolean locked) {
this.locked = locked;
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) {
if (locked) {
return false;
}
return super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type);
}
public boolean isLocked() {
return locked;
}
}
Самое простое использование в вашем макете xml:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:layout_behavior="path.to.the.class.LockableAppBarLayoutBehavior"
>
Последнее, вот как вы блокируете и разблокируете в коде:
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
LockableAppBarLayoutBehavior behavior = (LockableAppBarLayoutBehavior) layoutParams.getBehavior();
behavior.setLocked(true);