CoordinatorLayout.Behavior callbacks do not start

I wrote the CordinatorLayout.Behaviour class and assigned it to a child of CordinatorLayout, LinearLayout using

 app:layout_behavior="com.mob2.zd2duta.infodrawer.components. FloatingHeaderBehaviour" 

but calls to layoutDependsOn, onStartNestedScroll, onInterceptTouchEvent are called, the rest are not called. What am I doing wrong

 public class FloatingHeaderBehaviour extends CoordinatorLayout.Behavior<LinearLayout> { private String TAG = FloatingHeaderBehaviour.class.getSimpleName(); private Context context; public FloatingHeaderBehaviour(Context context, AttributeSet attrs) { this.context = context; } @Override public boolean layoutDependsOn(CoordinatorLayout parent, LinearLayout child, View dependency) { boolean val = (dependency.getId() == R.id.nested_scrollview); return val; } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, LinearLayout child, View dependency) { Utils.logD(this.getClass().getSimpleName(), "dependency changed"); return true; } @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, LinearLayout child, View directTargetChild, View target, int nestedScrollAxes) { Utils.logD(this.getClass().getSimpleName(), "scroll started"); return super.onStartNestedScroll(coordinatorLayout,child, directTargetChild, target, nestedScrollAxes); } @Override public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, LinearLayout child, View target) { Utils.logD(this.getClass().getSimpleName(), "scroll stopped"); super.onStopNestedScroll(coordinatorLayout, child, target); } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, LinearLayout child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { Utils.logD(this.getClass().getSimpleName(), "scroll changed"); super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); } @Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, LinearLayout child, View target, int dx, int dy, int[] consumed) { Utils.logD(this.getClass().getSimpleName(), "scroll pre"); super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); } @Override public boolean onInterceptTouchEvent(CoordinatorLayout parent, LinearLayout child, MotionEvent ev) { Utils.logD(this.getClass().getSimpleName(), "onInterceptTouchEvent"); return super.onInterceptTouchEvent(parent, child, ev); } @Override public boolean onTouchEvent(CoordinatorLayout parent, LinearLayout child, MotionEvent ev) { Utils.logD(this.getClass().getSimpleName(), "onTouchEvent"); return super.onTouchEvent(parent, child, ev); } @Override public void onNestedScrollAccepted(CoordinatorLayout coordinatorLayout, LinearLayout child, View directTargetChild, View target, int nestedScrollAxes) { Utils.logD(this.getClass().getSimpleName(), "onNestedScrollAccepted"); super.onNestedScrollAccepted(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } @Override public boolean onNestedFling(CoordinatorLayout coordinatorLayout, LinearLayout child, View target, float velocityX, float velocityY, boolean consumed) { Utils.logD(this.getClass().getSimpleName(), "onNestedFling"); return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed); } @Override public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, LinearLayout child, View target, float velocityX, float velocityY) { Utils.logD(this.getClass().getSimpleName(), "onNestedPreFling"); return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY); } } 
+5
source share
2 answers

In onStartNestedScroll () Javadoc :

Only behavior that returns true from this method will receive subsequent nested scroll events.

The default behavior always returns false , this is what you return when you call return super.onStartNestedScroll() . Instead, you should return true for nestedScrollAxes , for which you want to receive scroll events for:

 @Override public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, final View directTargetChild, final View target, final int nestedScrollAxes) { return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; } 
+13
source

Just the same problem. Be that as it may, I found on Google something called "NestedScrollView". And yes. "NestedScrollView" is the answer. Use it in a ScrollView, and also do what you can see in the above text. Works great!

0
source

All Articles