2013-02-19 55 views
2

我使用类似的代码制作sereval Android应用程序,但我需要保持灵活性来定制应用程序。我现在的解决方案是,我有一个库项目,我可以通过扩展类来覆盖项目中的功能。对于下面的例子,我打电话给Library Project PL。 P1是使用PL的定制项目,P2是使用PL的另一个定制项目。覆盖Android库项目中的类

我现在的问题是,在PL中我想从StudentPL.java创建一个实例。在P1中,不需要对StudentPL进行任何更改,因此编译器应该使用这个类,但是在P2中,我有StudentP2.java,它从StudentPL.java扩展而来。所以在PL中创建的实例应该是StudentP2.java的一个实例。

我的想法是现在,我制作一个名为mirror的包,它直接位于Project PL的src-Folder中。在那里我创建了从StudentPL.java扩展而来的类mirror.Student.java。在Library-Project中,我现在创建了Student.java的一个实例。对于Project P1,不需要进行任何更改。在P2中,我在src文件夹中创建了相同的文件夹镜像,并且现在生成了从StudentP2.java继承的同一个类mirror.Student.java。思想是,将现在的ClassLoader从P2加载mirror.Student.java,并从PL忽略mirror.Student.java,但这会导致以下错误:

  • 敏捷装载机]无法执行DEX:多DEX文件定义了Lmirror/Student;
  • 转换为Dalvik的格式失败:无法执行DEX:多DEX文件定义Lmirror /学生

下面是一个UML什么我谈论:

http://www.koenix-band.ch/images/other/Stackoverflow.gif

也许我应该覆盖ClassLoader,但我不知道如何做到这一点?有没有人有解决这个问题的想法?也许有人有另一个想法,我可以如何定制应用程序。

迈克尔

回答

0

在我看来,这将是更好地使你的MainActivityPL抽象与setStudent或类似的方法。大部分活动及其所有逻辑仍将从您的图书馆共享,但通过扩展StudentPL课程,您的其他项目可以选择使用不同的学生对象。

+0

感谢您的回答这实际上是我之前制作的方式。对于数据库操作,我使用ORMLite。这需要泛型类型,然后我需要从其他泛型类型传递。当我有很多模型时,这不是很酷的处理,所以我希望找到一种方法来使它更容易。 另一个问题是,我的应用程序随着时间的推移有点复杂。所以它不仅仅是MainActivityPL .java,它使得这个对象的一个​​实例还有更多。为了处理这个问题,我做了getStudent()抽象方法,所以我一定会得到正确的对象。 – user2087312 2013-02-19 15:23:34