編輯:關於Android編程
通常我們都會使用context.getResources().getIdentifier(name, type,context.getPackageName())的方法去獲取R.java中的數據。
type——R其中的內部類名,如"drawable","string","color","dimen","layout"等,這也是我們常用的關於界面所需要獲取的數據類型。
name——R內部類中的static變量名稱,如"appname"等,這些都是有用戶在xml文件中定義的,包括layout,drawable文件中xml的文件名稱。
最後一個參數就是apk的包名。
其實為何使用context.getResources().getIdentifier來獲取資源的數值,很簡單,在開發屬於自己的sdk的時候,因為你的資源文件和jar包供給其他人使用,在界面方面自然都會使用此方法來獲取資源對應數值。
接著回到正題,因為在開發屬於自己的控件,用到了attr自定義屬性,在期間發現一個問題,即styleable的數值無法使用context.getResources().getIdentifier來獲取,結果永遠都是0,而且styleable中還包括數組數據,所以最後還是用java的反射方法來獲取。上代碼:
/**
* 對於context.getResources().getIdentifier無法獲取的數據,或者數組
* 資源反射值
* @paramcontext
* @param name
* @param type
* @return
*/
private static Object getResourceId(Context context,String name, String type) {
String className = context.getPackageName() +".R";
try {
Class> cls = Class.forName(className);
for (Class> childClass : cls.getClasses()) {
String simple = childClass.getSimpleName();
if (simple.equals(type)) {
for (Field field : childClass.getFields()) {
String fieldName = field.getName();
if (fieldName.equals(name)) {
System.out.println(fieldName);
return field.get(null);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
*context.getResources().getIdentifier無法獲取到styleable的數據
* @paramcontext
* @param name
* @return
*/
public static int getStyleable(Context context, Stringname) {
return ((Integer)getResourceId(context, name,"styleable")).intValue();
}
/**
* 獲取styleable的ID號數組
* @paramcontext
* @param name
* @return
*/
public static int[] getStyleableArray(Context context,String name) {
return (int[])getResourceId(context, name,"styleable");
}
本文實例講述了Android編程實現自定義toast。分享給大家供大家參考,具體如下:效果圖:代碼://自定義布局的toastcustomViewToast.setOnC
監聽器在Java中非常常用,在自定義控件時可能根據自己的需要去監聽一些數據的改變,這時就需要我們自己去寫監聽器,Java中的監聽器實際上就是C++中的回調
由於項目上的需要側滑條目展示收藏按鈕,記得之前代碼家有寫過一個厲害的開源控件 AndroidSwipeLayout 本來准備直接拿來使用,但是看過 issue 發現現在有
Blog誕生記Android studio構建項目有時候build.gradld構建緩慢,嚴重影響了開發心情,這僅是次要因素,最重要的是leader為了考慮團隊發展,建議