【问题标题】:"This type is final so it cannot be inherited from" - ViewPager2“此类型是最终类型,因此无法继承” - ViewPager2
【发布时间】:2019-05-21 03:38:52
【问题描述】:

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

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

}

但是,我的ViewPager2(context) 上出现“此类型是最终类型,因此无法继承”红线。

有什么想法吗?

【问题讨论】:

  • 嗯,就像消息说的那样。这个类是最终的,所以你不能扩展它。
  • 你添加的链接说它的定义为public final class ViewPager2 ..你不能扩展最终类..
  • 知道当我在SeekBarPreference 上向左/向右滑动时如何防止查看器执行吗?

标签: android kotlin android-viewpager


【解决方案1】:

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

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

// 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 之间。

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多