在android開發過程中,我們經常會有這種需求,自己開發一個類庫jar包,提供給別人調用。
即把項目A封裝成jar包,供項目B調用,而在項目B中調用項目A的activity的時候問題就出現了:找不到資源文件(異常:ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException: Stringresource ID #0x7f060007)。問題是,只能共享src文件夾下的代碼,而不能共享res資源文件,夠郁悶!
創建一個Androidproject, 用eclipse的export導出,去掉AndroidManifest.xml,res 什么的,這樣只共享了代碼,而此代碼中所調用的res資源文件卻不能正常使用,否則會拋出res.Resources$NotFoundException異常。
那么如何解決呢?
1.如果只用共享代碼,而共享的代碼中不涉及到res資源文件的調用的話,直接在Eclipse中導出jar包,在所需要的項目中引用即可。
2.如果共享代碼,而且共享的代碼中涉及到res資源文件的調用,網上通用的方法是把res資源文件放到assets文件夾中,再在src代碼中加載處理,然后再用eclipse導出jar包,引用即可(res資源雖然可以打進jar包,但當其他項目調用jar包時jar包中引用ID 指向的是當前項目的資源,關於如何讓jar包中的資源引用只想jar包中的res文件暫無解決方案。我的問題已解決,解決方案:把圖片資源放入assets包中一並打入jar包,布局就只能用代碼了。jar包中代碼可以成功引用jar包內的assets文件。
另:JNI層不可被打包入jar包,只能同jar包一同提供給第三方並放入工程目錄下的libs包中)。
3.如果共享代碼,而且涉及到res資源文件的調用,而且不想把res資源文件放到assets文件夾中的,直接生成jar包會出現的問題:
1).當在別的項目中引用此jar包時,在項目名上出現小紅叉,並且在console控制台上直接自動提示:Errorgenerating final archive: Found duplicate file for APK:res/drawable-hdpi/icon.png,通常的解決方法時,在能編譯通過的此項目中直接去掉提示的資源文件,再生成jar包。
2).把公共的icon等資源文件刪除,生成jar包之后,此時在項目中引用,console控制台上無自動報錯現象。如果jar包中的activity調用了res資源文件夾中的文件,在當前項目中調用jar包中的acticity時,問題就出現了,activity所引用的res資源,如果引用的是Strings.xml文件中的值,則拋出異常ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException:Stringresource ID#0x7f060007。如果引用的是layout文件夾中的文件,能找到layout中的xml,例如layout中ee.xml,可以找到R.layout.ee,但是在ee.xml中定義的控件id卻引用不到,拋出異常ERROR/AndroidRuntime(13703):Caused by:java.lang.NullPointerException。如果在當前項目中調用不涉及jar包中的res的調用,一切OK。
4.如果共享代碼,而且共享的代碼中涉及到res資源文件的調用,如果封裝成jar包,這種方法是達不到要求的(調用jar中封裝的activity,還得保證jar包中activity正常調用jar中所封裝的res資源,上面說了,jar包中的res資源部分調用為空),那么如何能滿足需求呢?把要生成jar包的項目做一下處理,在jar包項目的properties窗口中選擇android的選項卡的isLibaray,點擊apply按鈕或者ok按鈕(此時,jar包項目再點擊右鍵選擇runas → AndroidApplication就能正常運行了)。在要引用jar包的項目中,右擊項目名稱,打開properties框口,選擇android的選項卡的isLibaray右側的Add按鈕,添加jar包項目。這樣jar包項目中的activity就能正常引用到jar包項目中的res資源了。項目調用jar包項目的activity就正常了。