【问题标题】:How can I replace/customize an Android API class?如何替换/自定义 Android API 类?
【发布时间】:2015-05-13 17:38:53
【问题描述】:

我还没有找到任何指导。

我想对一个 Android API 类 (ViewPager) 做一个小改动,并将其导入我的项目。我想自定义一个不公开的方法的参数。

我试图扩展这个类并覆盖该方法,但由于它受到保护,我无法从我的包中访问 super.method(),所以我不知道如何继续。

我在 Android Studio 中对其进行了反编译,尝试复制并粘贴该类,但它不起作用。我现在一头雾水。

我怎样才能实现它?

这是我尝试过的:

【问题讨论】:

  • 你用什么方法有问题?您应该能够覆盖受保护的方法...
  • 查看我添加的屏幕截图
  • “因为它受到保护”——setCurrentItemInternal() 不是protected。它是“包私有”,意味着只有android.support.v4.view 包中的代码可以访问它。
  • 哇,这对我来说是新东西!直到今天,我还认为非私有/非公开的默认设置是受保护的,对话结束。感谢您的信息!

标签: android android-source


【解决方案1】:

您可以在AOSP项目中找到ViewPager的来源:https://android.googlesource.com/platform/frameworks/support/+/android-5.1.1_r2/v4/java/android/support/v4/view/ViewPager.java并将其复制到您的项目中。然后,您可以根据需要对其进行修改和扩展。

但是,如果您遵循本课程,您将无法从新 AOSP 版本的 ViewPager 中获得更新的好处。我强烈建议您找到另一种方法来实现您的目标,而无需像这样复制 ViewPager。

【讨论】:

    【解决方案2】:

    你拥有的可能性:

    • 扩展类并覆盖公共或受保护的方法。
    • 从 Android 源代码复制并粘贴整个类,进行必要的更改。
    • 使用反射改变行为。

    关于 ViewPager 的速度:检查以下 SO 问题:

    Slowing speed of Viewpager controller in android

    Android: velocity-based ViewPager scrolling

    【讨论】:

    • 查看我的屏幕截图。为什么我不能覆盖那个方法?
    • 包方法只能从位于同一包中的类访问。所以如果android.view.ViewPager是你要访问的类,你可以从android.view.View调用方法,但不能从android.os.Handler调用,因为包已经不一样了。
    • 我尝试过反射,但从我的测试来看,它并没有忽略方法的访问修饰符(这是有道理的)。我会坚持你提到的 SO 答案。谢谢
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多