繼上一篇的使用Lib
前情提要:
最近因為案子需要開始接觸android,完全沒碰過android的我只能硬者頭皮上架,第一個就遇到問題:
因為我的lib有activity,所以如果直接做成.jar供Client呼叫,如下方式:
Intent intent = new Intent(v.getContext(), LibMainActivity.class); intent.putExtra("userid", "breeze"); intent.putExtra("facextra", "server_1"); startActivity(intent);
會在執行時出現 classdefnotfound exception!
後來找了一下文章,官方提到以下面的方式使用lib:(看友方(?)的使用文件也是一樣方式)
Setting up a Library Project
但很明顯的..這個等於完全將我的
然後後來看到facebook sdk也是一樣這樣做法,心想可能真的就得如此做了吧,再加上隔天就要交差實在找不到解法的情況下,第二天只好這樣子交給廠商了,結果......
第二天廠商表明他們使用U3D開發,不是純android project,所以無法這樣include Lib,但是因為我真的不懂要怎麼弄成jar還能順利將activity成功啟動...因此他就自己做掉了,厚者臉皮詢問下他跟我說只要將R.id.xxx的resource拿掉改成如下方式:
public static int getLayoutId(Context ctx,String paramString){ return ctx.getResources().getIdentifier(paramString, "layout", ctx.getPackageName()); }就可以了,我照者試做,的確把所有的R.id.xxx的引用點改掉,原先為:
TextView text = (TextView) findViewById(R.id.noticeText);
改為:
int rid = ResourceUtil.getId(LibMainActivity.this,"noticeText"); TextView text = (TextView) findViewById(rid);
的確可以運作成功,可是!!!打包成.jar一樣會有錯誤阿!!!
找了半天終於找到解答了,簡單說明就是(明明打了很多廢話還簡單說明...)
- 將所有R.id.xxx的引用方式改為上述使用
- 所有資源檔的名字不能重複:例如預設的activity_main.xml就最好不要使用,因為使用的client也有可能很偷懶用了預設名稱
- 將所有lib會使用到的activity在Client的AndroidManifest.xml中也一併宣告,請參考下方的Declaring library components in the manifest file
- lib打包成jar時,除了選擇src以外其他都不能選擇
- 將打包好的jar置放(貼)於client project的 libs/ 底下
- 將所有會引用到的resource一併手動複製貼到client端的resource對應位置(資料夾下),例如res/layout/...
所以這麼一來雖然每次release時都要給出lib.jar與resource,但的確感覺比直接給出整個lib project要來的好得多了。
詳細圖文請參考Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
p.s剛剛才發現這篇文章是2013/7/6發布的耶!!!今天是2013/7/10,我真要感謝他剛好在我有問題前幾天發文...
p.s剛剛才發現這篇文章是2013/7/6發布的耶!!!今天是2013/7/10,我真要感謝他剛好在我有問題前幾天發文...
沒有留言:
張貼留言