CoordinatorLayout.Behavior обратные вызовы не срабатывают
Я написал CordinatorLayout.Behaviour
класс и назначил его в дочернем CordinatorLayout, LinearLayout, используя
app:layout_behavior="com.mob2.zd2duta.infodrawer.components. FloatingHeaderBehaviour"
но вызываются только обратные вызовы layoutDependsOn, onStartNestedScroll, onInterceptTouchEvent, остальные не вызываются. Что я делаю неправильно
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);
}
}
2 ответа
В соответствии с onStartNestedScroll () Javadoc:
Только Поведения, которые возвращают true из этого метода, получат последующие вложенные события прокрутки.
Поведение по умолчанию всегда возвращает false
, который вы возвращаете, когда вы звоните return super.onStartNestedScroll()
, Вы должны вместо этого вернуться true
для nestedScrollAxes
Вы хотите получать события прокрутки для:
@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;
}
Просто была такая же проблема. Случайно, я нашел в Google что-то под названием "NestedScrollView". И да. "NestedScrollView" является ответом. Используйте его вместо ScrollView, а также делайте то, что вы видите в ответе выше. Работает отлично!