2013-02-19 52 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