一、說明
??筆記主要是記錄一些本人在開發(fā)當(dāng)中的學(xué)習(xí)和使用筆記粘驰。筆記內(nèi)容包含一些本人覺得重要的知識(shí)點(diǎn)屡谐、本人易犯的錯(cuò)誤等。
??由于本人水平有限蝌数,其中出現(xiàn)的錯(cuò)誤或者不合理的地方望各位讀者多多包含愕掏,并指出其中不合理和錯(cuò)誤的地方,以便我來修改正顶伞。謝謝滑潘!
二、筆記時(shí)間
??2019年07月01日
三粹舵、簡述
??本文主要記錄如何使用第三方 APP 內(nèi)的資源。
四诅需、詳情
??最近在做一個(gè)項(xiàng)目的時(shí)候,突然想到能不能字節(jié)引用第三方APP的自定義View丐箩。之所以這么想施籍,是因?yàn)橛幸粋€(gè)自定義的view比較復(fù)雜竿裂,但是在另外一個(gè)項(xiàng)目當(dāng)中已經(jīng)做得不錯(cuò)了,但又不好移植到新項(xiàng)目當(dāng)中。
??話說回來,雖然目前已經(jīng)實(shí)現(xiàn)使用第三方APP中自定義的View,包括第三方APP中的所有資源。但是九秀,重點(diǎn)是但是,我還是遇到問題了娇豫。當(dāng)我使用第三方自定義View的時(shí)候框杜,或多或少出現(xiàn)了一點(diǎn)點(diǎn)問題振劳,比如畫布繪制的時(shí)候弱贼,代理執(zhí)行繪制時(shí)數(shù)據(jù)突然丟失問題鸟辅。由于時(shí)間比較趕捺檬,所以我也就沒有進(jìn)一步研究,用了最笨的方式,把第三方APP直接全部作為一個(gè)lib導(dǎo)入了渡处,汗顏按挤荨馍悟!
??雖然說最好我沒有用赞弥,但是我總結(jié)了一個(gè)第三方APP資源使用的Utils戏蔑,接下來就介紹一下這個(gè)工具情龄。先不說其它的捍壤,先把工具類全部貼出來鹃觉,如下:
public class ResourceUtils {
/**
* 獲取第三方 app 的 Context
*
* @param context 當(dāng)前 APP 的 Context
* @param packageName
* @return
* @throws PackageManager.NameNotFoundException
*/
public static Context getRemoteContext(Context context, String packageName) throws PackageManager.NameNotFoundException {
return context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
}
/**
* 通過名字獲取 ID
*
* @param context 待獲取資源的 Context
* @param resType layout盗扇、id、color允青、string琼掠、drawable
* @param resName
* @return
*/
public static int getId(Context context, String resType, String resName) {
return context.getResources().getIdentifier(resName, resType, context.getPackageName());
}
/**
* 獲取布局文件的資源 ID
*
* @param context 待獲取資源的 Context
* @param name layout 文件名
* @return
*/
public static int getLayoutId(Context context, String name) {
return getId(context, "layout", name);
}
/**
* 獲取布局文件的 View
*
* @param context 待獲取資源的 Context
* @param layoutId
* @return
*/
public static View getLayout(Context context, int layoutId) {
return ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(layoutId, null);
}
/**
* 從控件中獲取資源的 ID
*
* @param context 待獲取資源的 Context
* @param name id 名稱
* @return
*/
public static int getViewId(Context context, String name) {
return getId(context, "id", name);
}
/**
* 獲取顏色
*
* @param context
* @param name
* @return
*/
public static int getColorId(Context context, String name) {
return getId(context, "color", name);
}
/**
* 從 strings.xml 里面獲取資源的ID
*
* @param context 待獲取資源的 Context
* @param name
* @return
*/
public static int getStringId(Context context, String name) {
return getId(context, "string", name);
}
/**
* 從 Drawable 里面獲取資源的ID
*
* @param context 待獲取資源的 Context
* @param name
* @return
*/
public static int getDrawableId(Context context, String name) {
return getId(context, "drawable", name);
}
/**
* 從 Mipmap 里面獲取資源的ID
*
* @param context 待獲取資源的 Context
* @param name
* @return
*/
public static int getMipmapId(Context context, String name) {
return getId(context, "mipmap", name);
}
/**
* 獲取顏色
*
* @param context
* @param name
* @return 顏色值
*/
public static int getResColor(Context context, String name) {
return context.getResources().getColor(getColorId(context, name));
}
/**
* 從 strings.xml 里面獲取字符串
*
* @param context 待獲取資源的 Context
* @param name
* @return
*/
public static String getResString(Context context, String name) {
return context.getString(getStringId(context, name));
}
/**
* 從Drawable目錄獲取 Drawable 對(duì)象
*
* @param context 待獲取資源的 Context
* @param name
* @return
*/
public static Drawable getResDrawable(Context context, String name) {
return context.getResources().getDrawable(getDrawableId(context, name));
}
/**
* 從Mipmap目錄獲取 Drawable 對(duì)象
*
* @param context 待獲取資源的 Context
* @param name
* @return
*/
public static Drawable getResMipmap(Context context, String name) {
return context.getResources().getDrawable(getMipmapId(context, name));
}
}
??其實(shí)注釋已經(jīng)很清楚了玷室,簡單說兩點(diǎn):
- 要拿取其它 APP 的資源,就需要得到其它 APP 的Context笤受,所以 getRemoteContext 是最只要的方法
- ResourceUtils 類中其它方法都是獲取其它 APP 的資源穷缤,所以他們傳入的參數(shù) Context 都是 getRemoteContext 獲取到的
Context。
??使用樣例箩兽,挑了幾個(gè)作為使用樣例津肛,供大家參考:
Context plugContext;
try {
plugContext = ResourceUtils.getRemoteContext(context, "plug.app.package");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
int layoutId = ResourceUtils.getLayoutId(plugContext, "activity_test");
View view = ResourceUtils.getLayout(plugContext, layoutId);
ImageView imageView = view.findViewById(ResourceUtils.getViewId(plugContext, "test_img"));
imageView.setBackgroundColor(ResourceUtils.getResColor(plugContext, "screen_color_value09"));
/** view 引入第三方 app 的 layout
FrameLayout test = findViewById(R.id.test);
test.addView(view);
*/