为啥Android ViewPager2 类是final?

Posted

技术标签:

【中文标题】为啥Android ViewPager2 类是final?【英文标题】:Why is the Android ViewPager2 class final?为什么Android ViewPager2 类是final? 【发布时间】:2020-01-27 03:55:59 【问题描述】:

在我当前的项目中使用ViewPager2 时,我想使用setOnTouchListener,但我无法获得任何事件。

我决定扩展 ViewPager2 类以覆盖触摸事件方法,但由于类定义是最终的,因此无法实现。

为什么这个类是最终的,有什么方法可以扩展它以便我可以覆盖触摸事件?

【问题讨论】:

这是 alpha atm,因此您仍然可以提交问题 in Google's tracker for VP2。但是,someone already beat you to it 太好了,有人已经提交了,但我不认为它是白做的,所以我想知道原因 【参考方案1】:

嗯,我认为他们从一开始就搞定了整个 viewpager。最喜欢,因为片段代码中的所有片段也被搞砸了。

他们甚至要求我们不要使用来自全新 androidx 的普通 viewpager,因为它有错误。我认为报告的一些错误现在是旧代码,试图修复旧 viewpager 实现中的问题。我认为他们现在的代码足够稳定,可以使用,并且不希望我们在过渡到 viewpager2 时实施所有现在不必要且可能适得其反的修复。

我对过去懒惰的 google 处理整个片段和 viewpager 的东西感到非常生气。它说明了他们从未在主代码库中使用它,并且总是建议使用兼容包。

简而言之。现在,经过多年的努力,他们开始工作了,他们希望你放弃所有现在不再需要的修复。

【讨论】:

我不喜欢 ViewPager2。滑动动画时甚至无法控制速度。它看起来很蹩脚。由于动画缓慢,我的 ActionBar 菜单项在切换到另一个片段时需要一些时间来显示【参考方案2】:

可能是final,因为它不是扩展它的想法

...而且该关键字在防止这种情况方面非常有效。

【讨论】:

如果我想自定义行为怎么办?并且之前的浏览器不是最终的 只需使用ViewPager 或从源代码构建它,然后您可以删除final 关键字...但可能出于某种原因将ViewPager2 设置为final。 issuetracker.google.com/issues/140751461 确定他们不是无缘无故的,我希望有人告诉我们原因 @AhmedElshaer 只需关注问题跟踪器上的上述错误......但已经两周没有反应,这可能会导致“按预期工作,无法修复”。 issuetracker.google.com/issues/135299048 透露,他们不会在 1.0.0 stable 发布之前添加功能。 @MartinZeitler 如果您只知道需要自定义多少子类才能使其工作。 ..可能 6..【参考方案3】:

你可以使用viewPage2里面的recyclerView的onTouch。

fun ViewPager2.getRecyclerView(): RecyclerView 
    val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
    recyclerViewField.isAccessible = true
    return recyclerViewField.get(this) as RecyclerView

用法

 pager2.getRecyclerView().setOnTouchListener  view, motionEvent ->
        false
    

【讨论】:

以上是关于为啥Android ViewPager2 类是final?的主要内容,如果未能解决你的问题,请参考以下文章

Android使用ViewPager2实现页面滑动切换

在 Android 中正确实现 ViewPager2

带有viewpager2 android的导航图

Android ViewPager2 笔记

Android ViewPager2 笔记

Android ViewPager2 setPageMargin 未解决