2011-01-11 61 views
2

我已經開發了幾個Android應用程序,並創建了一個我經常在多個應用程序中使用的類的代碼庫。此代碼全部位於Subversion(svn)存儲庫中,每個應用程序位於其自己的存儲庫中。然後每個應用程序都有svn:所需軟件包的外部引用(例如,com.company.android.views)。除非需要爲自定義屬性導入R類,否則這很有用。跨Android應用程序使用的自定義視圖和屬性

定製視圖具有像這樣的導入:

import com.company.apps.myapp.R 

,以便它可以具有這樣的代碼:

attributes.getBoolean(R.styleable.WebImageView_autoload, autoload) 

即自定義屬性在res /值/ attrs.xml定義:

<declare-styleable name="WebImageView"> 
    <attr name="autoload" format="boolean" /> 
    ...others 
</declare-styleable> 

這很好,但問題出現在我有第二個應用程序使用相同的視圖。現在我更新導入到import com.company.apps.anotherapp.R,這樣它就可以與「anotherapp」一起工作,並用「myapp」打破它。當一次處理多個應用程序時,這成爲一個問題。

我的臨時解決方案是檢查適用類的更新,然後將svn:externals鎖定到該特定修訂。每個應用程序最終都被鎖定到了一個不同的修訂版本,而這個版本很快就會變得雜亂無章,但這似乎比將各個類直接複製到應用程序的回購更好。

唯一的其他解決方案,我一直在使用反射,像想到這一點:

Class class = Class.forName(context.getPackageName() + ".R"); 
Field[] fields = class.getDeclaredFields(); 

然後遍歷領域,指派我關心到變量在整個類使用的人。這似乎相當笨拙,特別是當我們可以談論幾個需要這樣做的課程時。

我該如何解決這個問題?有沒有辦法動態導入com.company.apps。*。R或以某種方式生成不依賴於特定應用程序的不同R類?還是有其他一些明顯的(或不是很明顯的)解決方案,我完全錯過了?

回答

0

花了我一陣子,但我找到了一個很好的答案:Library Projects

結構上,庫項目與標準的Android應用程序項目相似。例如,它包含項目根目錄下的清單文件,以及src /,res /和類似的目錄。該項目可以包含與標準Android項目相同類型的源代碼和資源,以相同方式存儲。例如,庫項目中的源代碼可以通過其R類訪問自己的資源。

+0

嗨,你有沒有做任何特殊的自定義屬性在你的圖書館項目工作?當我嘗試它時,只有在庫和最終應用程序使用相同的名稱空間時才能成功編譯。如果我想要2個應用程序使用相同的庫(例如:免費和付費版本),這種方法效果不佳。 – Gromix 2011-02-24 11:32:35

相關問題