首页 > 解决方案 > “这种类型是最终的,所以它不能被继承” - ViewPager2

问题描述

我正在尝试扩展ViewPager2课程,以便允许SeekBarPreference左右拖动。

class ViewPager2Custom(context: Context) : ViewPager2(context) {

}

但是,我的ViewPager2(context).

任何想法?

标签: androidkotlinandroid-viewpager

解决方案


NestedScrollableHost 类完全符合您的要求:https ://github.com/android/views-widgets-samples/blob/master/ViewPager2/app/src/main/java/androidx/viewpager2/integration/testapp/ NestedScrollableHost.kt

基本思想是您通过该方法覆盖onInterceptTouchEvent并请求 NestedScrollableHost 的父级(在本例中为ViewPager2)以禁止它拦截触摸事件requestDisallowInterceptTouchEvent

// Pseudo-code for NestedScrollableHost

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    handleInterceptTouchEvent(event);
    return super.onInterceptTouchEvent(event);
}

private void handleInterceptTouchEvent(MotionEvent event) {
    // Early return if parent viewpager is null or child can't scroll in same direction as parent
    if (getParentViewPager() == null ||
            (!canChildScrollVertically(-1f) && !canChildScrollVertically(1f))) {
        return;
    }

    switch (event.getAction()) {
        // You can tailor your class to handle the event in the way you want to,
        // e.g. do something on down and move events:
        case MotionEvent.ACTION_DOWN:
            // Disallow the parent (and all subsequent parents) to intercept touch events.
            getParent().requestDisallowInterceptTouchEvent(disallow);
        case MotionEvent.ACTION_MOVE:
            // Some other logic.
    }
}

您可以将 NestedScrollableHost 放在XML 中的ViewPager2和(在您的情况下)之间SeekBarPreference


推荐阅读