5

napisałem klasę CordinatorLayout.Behaviour i przypisano je dziecku CordinatorLayout towarzyszącej, LinearLayout użyciuCoordinatorLayout.Behavior callbacks nie wywołują

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

ale tylko layoutDependsOn, onStartNestedScroll, onInterceptTouchEvent callbacks nazywane są, reszta nie dostać nazywa. Co robię źle

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); 
    } 
} 

Odpowiedz

13

Per na onStartNestedScroll() Javadoc:

tylko zachowania, które zwracają prawdę od tej metody otrzyma kolejne zagnieżdżone zdarzenia przewijania.

Domyślne zachowanie jest zawsze wrócić false, która jest, co wracają po wywołaniu return super.onStartNestedScroll(). Należy zamiast wrócić true dla nestedScrollAxes chcesz odbierać zdarzenia przewijania dla:

@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; 
} 
0

prostu miał ten sam problem. Przypadkowo znalazłem w Google coś zwanego "NestedScrollView". I tak. "NestedScrollView" jest odpowiedzią. Użyj go z poziomu ScrollView, a także zrób to, co możesz zobaczyć w anaswer powyżej. Działa w porządku !

+0

Czy możesz podać pełną odpowiedź? Odpowiedź "powyżej" nie zawsze musi być powyżej. – slfan

Powiązane problemy