【问题标题】:How to make a small change to Android source code, and incorporate into your own project如何对 Android 源代码进行小幅改动,并将其合并到您自己的项目中
【发布时间】:2013-04-18 14:13:18
【问题描述】:

我想对 Android 标准 TimePicker 类做一个小的改动。具体来说,我正在尝试对其进行更改,使其以 15 分钟为增量工作,而不是以 1 分钟为增量。

This post 帮助我将分钟值的范围限制为 {0, 15, 30, 45},这在我的应用中是必需的。但正如我在后续评论中指出的那样,分钟微调器仍将前一分钟显示为当前值 - 1,下一分钟显示为当前值 + 1,这会创建一个草率的用户界面。

我查看了相关的Android source code,看来我需要进行的更改非常简单。但是当我尝试将源代码复制到我的项目中时,我遇到了与package 声明、在哪里可以找到Widget、如何解析R.id 变量等相关的无数错误。

所以我的问题是:

从 Android 源代码对给定类进行小幅更改并将其合并到您自己的项目中的最佳方法是什么?

就我而言,我只需要对TimePickerNumberPicker 进行一些小改动,但我不确定如何在我的项目中正确设置。

感谢您的任何建议。

【问题讨论】:

    标签: android open-source android-source android-datepicker


    【解决方案1】:

    但是当我尝试将源代码复制到我的项目中时,我遇到了与包声明相关的无数错误

    您的源文件目录需要与包名匹配。而且由于您无法覆盖android.widget.TimePicker,您需要将该类移至新包或为其命名。

    在哪里可以找到小部件

    这意味着您将TimePicker 复制到您的一个包中。这很好,但是您需要为TimePicker 从其原始包中引用的类添加适当的import 语句。或者,您需要将您的(重命名的)TimePicker 保留在 android.widget 中,将此包添加到您的项目中。这是初级 Java。

    如何解析 R.id 变量

    如果TimePicker 依赖于不属于 Android SDK 的资源,您还需要将这些资源从 AOSP 复制到您的项目中。

    从 Android 源代码对给定类进行小幅更改并将其合并到您自己的项目中的最佳方法是什么?

    恕我直言,在摘要中无法轻易回答。一般来说,你会做我上面列出的那些事情。

    【讨论】:

    • 感谢您的回复。鉴于您的 cmets,以下是一种可行的方法:1)将 android.widget 包添加到我的项目中,2)将 TimePicker 和 NumberPicker 类从 Android 开源复制到我项目中的新类中,3)将 TimePicker 和 NumberPicker 重命名为否则,并进行我已经确定的小改动?
    • 还有@CommonsWare:如果上述方法有意义,我将如何/在哪里获取 android.widget 作为一个包?
    • @gcl1:“以下是一种可行的方法吗?”——当然值得一试。 “我如何/在哪里获得 android.widget 作为一个包?” ——我想我不明白你的问题。在 Java 中,包由源代码中的 package 行表示,该行必须与源文件的路径匹配。在您的情况下,添加 src/android/widget/ 并将代码放在那里。此外,请务必遵守您要重复使用的代码的许可条款。
    【解决方案2】:

    您最好继承相关类并覆盖您想要更改的方法。

    在 Java 中,您可以在子类中执行以下操作:

    • 继承的字段可以直接使用,就像其他的一样 字段。
    • 您可以在子类中声明一个同名的字段 超类中的那个,因此将其隐藏(不推荐)。
    • 您可以 在子类中声明不在超类中的新字段。
    • 继承的方法可以直接使用。
    • 您可以在子类中编写一个与超类具有相同签名的新实例方法,从而覆盖它。
    • 您可以在子类中编写一个与超类具有相同签名的新静态方法,从而隐藏它。
    • 您可以在子类中声明不在超类中的新方法。
    • 您可以编写一个子类构造函数来调用超类的构造函数,可以隐式调用,也可以使用关键字 super。

      More info on subclassing in Java

    【讨论】:

    • 感谢您的回复。这似乎是一个不错的方法,但就我而言,我需要更改一个没有直接访问器方法的私有变量 (mMinuteSpinner)。具体来说,我需要更改成员函数 (setOnValueChangedListener()) 的参数以使用不同版本的匿名内部类(MyNumberPicker 递增 15,而不是 NumberPicker 递增 1)。你认为使用子类化这一切都可行吗?
    • 您可以尝试使用反射来获得对私有变量的访问权限,或者您只需覆盖正在调用的任何方法来呈现控件并使用不同的变量。我确信通过子类化可以获得你想要的东西是可能的,但我不确定它最终是否会比修改源更多或更少的工作(以及你遇到的与此相关的头痛)。
    • 原来我需要改变的方法是TimePicker类的构造函数。我需要做的改变是它实例化的另一个类。太糟糕了,谷歌不只是为 TimePicker 提供分钟增量值,就像苹果在 iOS 中为它的等效项所做的那样!我认为这对于已经掌握代码的人来说并不难。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多