5

Tôi đã viết một lớp CordinatorLayout.Behaviour và gán nó trong con một của CordinatorLayout, một LinearLayout sử dụngcallbacks CoordinatorLayout.Behavior không kích hoạt

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

nhưng chỉ layoutDependsOn, onStartNestedScroll, callbacks onInterceptTouchEvent được gọi, phần còn lại không nhận được gọi là. Có gì là tôi làm sai

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

Trả lời

13

mỗi sự onStartNestedScroll() Javadoc:

Chỉ Hành vi đó trở thành sự thật từ phương pháp này sẽ nhận được sự kiện cuộn lồng nhau sau này.

Hành vi mặc định luôn là trả lại false, đó là những gì bạn đang quay trở lại khi bạn gọi return super.onStartNestedScroll(). Bạn thay vì phải trả lại true cho nestedScrollAxes bạn muốn nhận sự kiện cuộn cho:

@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

Chỉ cần có cùng một vấn đề. Accidentlly, tôi đã tìm thấy trong google một cái gì đó gọi là "NestedScrollView". Và có. "NestedScrollView" là câu trả lời. Sử dụng nó insted của ScrollView, và cũng làm những gì bạn có thể nhìn thấy trong anaswer ở trên. Hoạt động tốt!

+0

Bạn có thể cung cấp câu trả lời đầy đủ không? Câu trả lời 'ở trên' có thể không phải lúc nào cũng ở trên. – slfan

Các vấn đề liên quan