Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中獲取資源 id 及資源 id 的動態獲取

Android中獲取資源 id 及資源 id 的動態獲取

編輯:關於Android編程

 Android中獲取資源 id 及資源 id 的動態獲取

我們平時獲取資源是通過 findViewById 方法進行的,比如我們常在onCreate方法中使用這樣的語句:

btnChecked=(ImageView)findViewById(R.id.imgCheck);

findViewById是我們獲取layout中各種View 對象比如按鈕、標簽、ListView和ImageView的便利方法。顧名思義,它需要一個int參數:資源id。

資源id非常有用。Android回自動為每個位於res目錄下的資源分配id,包括各種圖片文件、xml文中的”@+id”對象。res的子目錄幾乎總是固定的,比如每次都能見到的:drawable-xxxx、layout、values,以及不常見的:anim、xml、row、color。

Android教科書上告訴你:

res/drawable/用來存放圖片文件;

res/layout/用來存放布局定義文件;

res/values/用來存放一些變量、參數等文件。

這都是我們已經知道的。此外,Android會為res目錄下的所有資源分配id,其主要的分配原則是:

drawable中的圖片文件總是每個文件一個資源id。

Xml文件中每個使用android:id=”@+id/xxx”的view都會被分配一個未用的資源id。

其他更復雜的規則也許每個人都會補充一些。

在 ADK 的API 中,有許多方法其實都會使用資源id作為參數,比如 getDrawable 方法 :

getResources().getDrawable(R.drawable.sendsms_bk));

從字面上看,getResouces方法返回一個android.content.res.Resources對象。

getDrawalbe方法返回一個Drawable對象,我們知道這就是一張圖片。

getDrawable方法使用的參數就是資源id。

但是,這些int型的資源id到底是些什麼數字?或者它們都放在哪裡。如果你夠細心,你可以在gen目錄的R.Java文件中找到它們。每個16進制整型id都有一個很O-O 的屬性名字,它們都是public static final的,建議你不要手動去修改它們。這些資源id位於不同類層次結構中,你仔細看一看,會發現其中的一些規律,比如,drawable類中包含資源id其實代表了res/drawable目錄中的圖片文件;layout類中包含的資源id其實是代表了在res/layout目錄中的xml文件 ;id類中包含的資源id其實是代表了布局xml文件中使用了 android:id=”@+id/xxx”的widget對象——當然如果你使用的是”@+Tyre/xxx”,則Android編譯時會在R.java 中創建一個叫做 Tyre 的類。

通過上面的了解,我們發現資源id就是以“R.”開頭的變量或屬性——因為它都定義在R類中——這個類跟android.R不是同一個R,它們不在同一個包層次中。前者是定義了android框架自己的資源,比如:android.R.layout.simple_expandable_list_item_1、android.R.layout.simple_expandable_list_item_2。這些資源你使用過嗎?有時間不妨試試。而另一個R就是我們自己的R了,定義了我們自己的資源id。我們可以用面向對象的R.xxx.yyy的方式使用資源id,當然也可以直接用16進制數來使用它們。

資源id在Android中是如此重要,因此我們只要獲得了資源id,即可獲得資源。因為某些情況下,我們不能使用某個常量作為資源id(因為我們想用一個變量代替它),所以只能采用兩種方式動態獲取資源id:

1、反射

java的反射是如此強大,以至於我們在走投無路時總是想起它。我們來看一段代碼:

try{

 Field field=R.drawable.class.getField(type);

 int i= field.getInt(new R.drawable());

 Log.d(tag,i+"");

 return i;

}catch(Exception e){

 Log.e(tag,e.toString());

 return R.drawable.unknow;

}

type是一個變量,他的可能值會是“close”、“edit”、“icon”等。我們通過java的反射類Field 去訪問 R.drawable 類下面的某個字段。實際上,我們知道在R.drawable 下的字段就是 res.drawable-xxxx 目錄下的圖片文件的資源id。因此運行上面的這段代碼,其實就是通過一個字符串去獲取對應圖片文件的資源id。比如,當 type 的值為“icon”時,上面的代碼會獲得res.drawable-xxxx目錄下的 icon.png 圖片文件的資源id並返回給我們。我們通過資源 id 來把圖片顯示在ImageView中就是順理成章的事了。

2、使用Resources 類的 getIdentifier方法

使用反射畢竟還是麻煩。如果同樣的事情用 android.content.res.Resources 類來干,就是兩句話而已:

Resources res=getResources();

return res.getIdentifier(type,"drawable",getPackageName());

getResources方法是來自於contenxt(也就是Activity類),它直接可以返回一個Resouces對象。而Resouces的getIdentifier方法可以返回R.java中的任何資源id,當然,你必須指定3個參數:字段名,類名,包名。包名指定了的 全限定名的包名部分,如果R 的全限定名為 android.R 或者 com.company.R,則包名在這裡就是“android”或“com.company”。getPackageName其實是this.getPackageName(),它直接返回本類的包名。

類名則是資源所屬的類。比如我們知道的,在R.java 類中的幾個固定的類:drawable、id、string、layout等,在它們下邊又定義了許多資源id。

字段名則是資源id的名字。比如這個資源id定義: public static final int del=0x7f020002;

del就是一個資源id的名字,0x7f020002則是它的16進制值。

通過3個參數,getIdentifier 方法就可以通過比較動態的方式獲得資源id。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved