Android中根據ID名動態獲取資源的兩個方法

在開發中, 我們習慣了類似下面這種方式去實現引用資源:

context.getResources().getDrawable(R.drawable.flower);

但是,當我們提前知道這個資源的id,想動態去引用,而不是在id裏面固化應該怎麼辦呢? 比如某個圖片資源的id是R.drawable.test_1, 而且有序的還有test_2,test_3, 我們如何動態的去引用它們?這裏有兩種方案:直接用反射和用resource的getIdentifier()方法,它們原理都差不多利用反射實現.

第一種方法:

/**
     * 輸入id,返回Bitmap
     * @param context
     * @param id
     * @return
     */
    public static Bitmap getBitMapById(Context context,String id){
        Bitmap mBitmap=BitmapFactory.decodeResource(context.getResources(),getresourceId("test_"+id));
        return mBitmap;
    }
    
    public static int getresourceId(String name){
        Field field;
        try {
            field = R.drawable.class.getField(name);
            return Integer.parseInt(field.get(null).toString());
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }

第二種方法(更加簡潔):

public static Bitmap getBitmapById(Context context,String id){
        Resources res = context.getResources();
        Bitmap mBitmap=BitmapFactory.decodeResource(res, res.getIdentifier(id, "drawable", "com.test.android"));
        return mBitmap;
    }

第二種方法中res.getIdentifier()裏面三個參數: 第一個是資源id名,第二個是類名,如果是string類型就是String,還有常見的drawable,layout等等,第三個參數是項目包名.

上面2種方法都能動態獲取資源,當我們知道某些資源的id是規律性的,比如前綴相同,後綴都是a-z 或者數字排序等等,就能動態構造id獲取資源,而不必每次都寫context.getResources().getDrawable(R.drawable.test_1);


更多例子:

一,獲取android工程裏面的各種資源的id;
1.1 string型 比如下面:
<< string name=”OK”>> 客戶端請求成功 << / string>>

//string資源中 名稱爲OK的 id 獲取方式
int strId = getResources().getIdentifier("OK", "string", getPackageName());
  • 1
  • 2

1.2 color型 比如下面:
<< color name=”colorPrimary”>>#3F51B5 << /color>>

//color資源中 id 獲取
int colorId = getResources().getIdentifier("colorPrimary", "color", getPackageName());  
  • 1
  • 2

1.3 dimens型 比如下面:
<< dimen name=”horizontal_margin”>16dp<< /dimen>>

//deimens資源 id 獲取
int dimenId = getResources().getIdentifier("horizontal_margin", "dimen", getPackageName());
  • 1
  • 2

1.4 mipmap文件夾下或者drawable文件夾下面的:比如ic_launcher.png

// mipmap文件夾下的名稱爲ic_launcher的圖片的id      
//mipmap資源id
int mipmapId = getResources().getIdentifier("ic_launcher", "mipmap", getPackageName());
  • 1
  • 2
  • 3

1.5佈局文件資源 比如R.layout.activity_main

//佈局文件的id,比如:R.layout.activity_main       
//佈局資源id
int layoutId = getResources().getIdentifier("activity_main", "layout", getPackageName());
  • 1
  • 2
  • 3

二.獲取Android系統裏面的資源id

//獲取系統裏的資源id android.R.drawable.ic_menu_share
int id = getResources().getIdentifier("ic_menu_share", "drawable", "android");  //注意,最後一個參數必須是“android
  • 1
  • 2

三.獲取Android工程資源的Uri路徑,一般是圖片,res或者asset下的

        //*獲取Res資源的url  ContentResolver.SCHEME_ANDROID_RESOURCE*/
        Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.mipmap.ic_launcher);
         Uri uri = Uri.parse("res:///" + R.mipmap.ic_launcher);
        //*獲取asset資源的url,ContentResolver.SCHEME_FILE*/
        Uri assetUri = Uri.parse("file:///android_asset/" + "qq.png");
  • 1
  • 2
  • 3
  • 4
  • 5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章