多个项目取决于1个库

时间:2014-10-23 16:13:04

标签: android eclipse adt

我不确定这是提出这个问题的正确位置所以请告诉我是否应该将它发布在ProgrammersSE上。

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

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

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

如果不使用反射,有什么方法吗?

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

编辑以澄清:

感谢@jucas和@Alex Cohn的答案和链接。我不确定你写的解决方案是否适用于我的情况 - 我可能必须看一些编码的例子,以决定我是否可以在我的项目中做任何类似的事情。

以下是一个让我有问题的例子:在我的图书馆项目中,我有一个名为MyActivity的类,它扩展了Activity并实现了OnScrollChangedListener,因为其中有一个ScrollView,其背景是必须扩大规模。可能会有这样的东西:

@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呢?

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

怎么可能实现这一目标?我很抱歉,如果我不能马上理解这一点 - 我从来没有做过这样的事情,而且有些概念是我有点难以理解他们。

2 个答案:

答案 0 :(得分:1)

这是一个非常常见的问题,并且有一些答案可能会或可能不是您的特定案例的最佳答案,这里有两个问题:

  1. 为您的应用开发插件架构,从插件Plugins architecture for an Android app?加载内容和功能,请注意,如果您只需要在此处更改几个类,这可能会有点过分。

  2. 修改您的库项目的架构:这是我倾向于使用最多的架构,因为它只是简单而且不需要非常复杂的重构。这需要的步骤通常是这样的:

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

    湾创建实现可扩展功能的接口的接口和类

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

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

  3. 我希望这会对你有所帮助,如果没有,你可能想要勾勒出一些代码,以便确切了解你遇到的问题

答案 1 :(得分:1)

这看起来非常适合"inversion of control"设计模式。如果项目之间没有更改 ExtendsActivity 类,但有时它使用类 MyActor actor ,有时 ExtendsMyActor ,那么你应该为 ExtendsActivity 准备一种方法来接受对这样的 actor 的引用。您可以在构建时注入此引用,或者稍后在活动的生命周期中注入此引用。

通常建议使用 interface ,即定义 IActor 并同时拥有 MyActor 和任何替代 { {1}} 此界面。但在某些情况下, implements 也非常适合。

相关问题