关于android:多个项目取决于1个库

Multiple projects depending on 1 library

我不确定 SO 是否适合提出这个问题,所以请告诉我是否应该将其发布在 ProgrammersSE 上。

我有一个带有一些功能和一些基本 XML 文件的 Android 库项目。在不久的将来,我将开发多个严重依赖于该库的应用程序——它们中的一些可能只是不同之处在于它们将使用不同的 XML 布局文件和图像资源。据我所知,如果相应文件的名称相同,Android 会自动从常规项目中选择项目而不是库中的项目,所以这应该不是问题。

问题是我希望某些项目必须具有稍微扩展的功能 - 这意味着我必须扩展库项目中的类。

我刚刚尝试过,但显然这不起作用,因为我没有覆盖类的整个代码 - 只是添加到它,这意味着我似乎无法让库活动从我的常规调用类项目。

不使用反射有什么办法吗?

有没有更好的方法来处理这种情况?

编辑澄清:

感谢@jucas 和@Alex Cohn 提供的答案和链接。我不确定您编写的解决方案是否适用于我的情况 - 我可能必须查看那些编码的示例以确定我是否可以在我的项目中做类似的事情。

下面是一个例子,说明这对我来说是什么问题:假设在我的库项目中,我有一个名为 MyActivity 的类,它扩展了 Activity 并实现了 OnScrollChangedListener,因为其中有一个 ScrollView,它的背景必须缩放。里面可能有这样的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Override
public void onScrollChanged() {

    int currentScrollOffsetY = this.scrollView.getScrollY();

    // No case for further back than the bottom of the screen (lower than 0)
    // and if it's higher than where it should stop, keep it at that point
    if (currentScrollOffsetY > this.screenHeightPx * MULTIPLIER_Y_ANIMATION_STOP) {

        currentScrollOffsetY = (int) (this.screenHeightPx * MULTIPLIER_Y_ANIMATION_STOP);
    }

    // Set the pivot points of the background images
    this.imageBackground.setPivotX(this.imageBackground.getWidth() / 2.0f);
    this.imageBackground.setPivotY(0);

    // Scale the background
    float newBackgroundScale = 1 - (float) currentScrollOffsetY / (float) this.screenHeightPx;

    if (newBackgroundScale < 0.75f) {

        newBackgroundScale = 0.75f;
    }

    this.imageBackground.setScaleX(newBackgroundScale);
    this.imageBackground.setScaleY(newBackgroundScale);
}

如您所见,背景图像的新比例决不会小于原始大小的 0.75。现在,如果使用库项目的项目之一需要将其改为 0.8,我可以将值从代码移动到 XML 值资源,并且应该从那里动态读取 - 这很好。

但是,如果我不仅想这样做,还想缩放另一个 ImageView 怎么办?

1
2
3
4
    this.imageBackground.setScaleX(newBackgroundScale);
    this.imageBackground.setScaleY(newBackgroundScale);
    this.differentImageBackground.setScaleX(newBackgroundScale);
    this.differentImageBackground.setScaleY(newBackgroundScale);

如何做到这一点?很抱歉,如果我没有立即理解这一点 - 我从来没有做过这样的事情,而且有些概念对我来说有点难以理解。


这看起来很适合"控制反转"设计模式。如果 ExtendsActivity 类在项目之间没有改变,但有时它使用 MyActor 类的 Actor,有时使用 ExtendsMyActor,那么您应该为 ExtendsActivity 准备一种方法来接受对此类 Actor 的引用。您可以在构造时或稍后在活动的生命周期中注入此引用。

通常建议使用 interface,即定义 IActor 并同时拥有 MyActor 和任何替代 implements 这个接口。但在某些情况下,extends 也非常适合。


这是一个非常常见的问题,并且有几个答案可能对您的特定情况是最好的,也可能不是最好的,这是我最想到的两个:

  • 为您的应用开发插件架构,以从插件加载内容和功能 Android 应用的插件架构?请注意,如果您只需要在这里和那里更改一些类,这可能是多余的。

  • 修改你的库项目的架构:这是我最常用的一种,因为它很简单,不需要非常复杂的重构。为此所需的步骤通常是这样的:

    一个。找出您的主要应用项目可能需要扩展您的活动或片段的哪些部分

    乙。为可扩展功能创建实现这些接口的接口和类

    c。这是棘手的部分,在您的活动或片段中的特定方法中隔离这些类的创建和使用

    d。最后在您的主应用程序项目中,创建实现相同接口的新类并覆盖您的片段或活动以创建这些类而不是

  • 我希望这对您有所帮助,如果没有,您可能需要草拟一些代码,以便准确了解您遇到了什么问题