2010-08-23 66 views
7

我希望能夠遍歷生成的R文件中的所有字段。Android:以編程方式遍歷資源ID

喜歡的東西:

for(int id : R.id.getAllFields()){ 
//Do something with id, like create a view for each image 
} 

我嘗試過反映,但我似乎無法加載包含真實R類別內特定的內部類。因此,舉例來說,這不會爲我工作:

Class c = Class.forName("packageName.R.id") 

我可以在R類本身反映,但我需要的ID類中的字段。

我也嘗試通過Resources類查找,但在那裏找不到任何東西。在這種情況下,似乎可以獲取resourceID並獲取該id的字符串名稱,或者獲取字符串名稱並獲取相應的resourceID。我找不到像這樣的東西:

int[] Resources.getAllResourceIDs() 

也許我正在討論這個錯誤。或者,也許我不應該打手動鍵入方式全部,例如:

int[] myIds = {R.id.firstResource, R.id.secondResource} 

這種方法與我的UI設計師的工作時,不是那麼靈活的缺點。每當他向XML文件添加新資源時,我都必須更新代碼。顯然不是太痛苦,但它仍然很好,它似乎應該是可行的。

編輯:

低於約ViewGroup.getChildCount()/ ViewGroup.getChildAt()是行之有效的答案。但是,我還必須找到一種方法來實例化我的XML ViewGroup/Layout。要做到這一點,請嘗試如下:

LayoutInflater li = MyActivity.getLayoutInflater(); 
ViewGroup vg = (ViewGroup) li.inflate(R.layout.main, null); 
+0

我並不是說這是表露無疑,但恕我直言,事實上,你覺得你需要問這個問題意味着你可能做有問題。你能詳細說明你的用例嗎?我只是想不出爲什麼我想要訪問在整個應用程序中定義的所有ID。 – Qberticus 2010-08-23 06:45:35

+1

我不想訪問所有的id,而是使用特定名稱(例如R.imageViewIds)的所有資源ID。這樣,在我的代碼中,我可以在一個for循環中添加一個事件監聽器或其他任何對象。我的用戶界面將有多個ImageViews,將全部響應事件,如果我可以訪問所有這些ImageView而不用手動編碼每個名稱,將會很好 (例如 IView1.setListener(myListener); IView2.setListener(myListener );) 此外,如果我的UI設計者決定重命名XML文件中的東西,那麼我將不必重構我的代碼。 – 2010-08-23 06:57:33

回答

5

您對我評論的回覆幫助我更好地瞭解您要做什麼。

你或許可以在您的視圖層次使用ViewGroup#getChildAtViewGroup#getChildCount遍歷各種ViewGroup S和對返回View s以後進行instanceof檢查。然後,您可以根據子視圖的類型以及它們在層次結構中的位置進行任何您想要的操作。

+0

這似乎是票!很高興澄清幫助。它並沒有跨越我的想法來訪問我的佈局的兒童意見。感謝大家的洞察力。 – 2010-08-26 06:14:19

+0

a code sample:http://stackoverflow.com/questions/4184889/android-refer-to-custom-views-in-a-loop/4185818#4185818 – 2011-05-13 20:51:50

2

您可以對內部類使用反射,但語法是packagename.R $ id。請注意,反射可能非常緩慢,您應該真正避免使用它。

+0

我在想反射可能太貴了,不值得只是爲了不必手動編碼某些項目而已。我希望有一些內置的,非重新連接的方式來訪問這些ID,因爲它似乎是一種常見的情況。 感謝,至少,反映在內部類的語法。知道這很有用。 – 2010-08-23 06:59:53

5

我發現「Class.forName(getPackageName()+」。R $ string「);」可以讓你訪問字符串資源,並且應該爲id,drawable,exc而工作。

然後我用發現像這樣的類:


import java.lang.reflect.Field; 

import android.util.Log; 

public class ResourceUtil { 

    /** 
    * Finds the resource ID for the current application's resources. 
    * @param Rclass Resource class to find resource in. 
    * Example: R.string.class, R.layout.class, R.drawable.class 
    * @param name Name of the resource to search for. 
    * @return The id of the resource or -1 if not found. 
    */ 
    public static int getResourceByName(Class<?> Rclass, String name) { 
     int id = -1; 
     try { 
      if (Rclass != null) { 
       final Field field = Rclass.getField(name); 
       if (field != null) 
        id = field.getInt(null); 
      } 
     } catch (final Exception e) { 
      Log.e("GET_RESOURCE_BY_NAME: ", e.toString()); 
      e.printStackTrace(); 
     } 
     return id; 
    } 
}