2016-08-04 58 views
0

我正在放置一個小的android庫供其他開發者在他們的android應用程序中使用。第三方開發者將添加我的自定義按鈕,例如「com.example.myLibrary.CustomButton」到它們的xml視圖中。 開發人員可以根據需要放置儘可能多的這些按鈕。從android中的活動返回組件ID的列表?

有沒有一種方法可以讓我的庫代碼識別活動中有多少個自定義按鈕,然後返回它們的ID,這些ID可以是應用程序開發人員設置的任何內容?

我已經嘗試過int[] i = getResources().getIdentifier("name","component","package");,但它返回一個6位數的int,我假設它是組件的一些系統標識符而不是它的每個實例。

注意 - 我知道圖書館將需要通過類似new MyLibrary(context);的應用程序活動的上下文來傳遞應用程序活動的上下文。我已經爲圖書館的其他方面實施了這項工作,所以這似乎不成問題。

很多感謝的任何建議,可以與問題

回答

1

的ID在Android的是,除非先前宣佈,在運行時自動分配整數幫助。這些ID對於每個控件都是唯一的,但@+id/myIdName部分僅用於在代碼中進行引用(請考慮枚舉)。如果你需要同時把所有的資源ID

getResources().getResourceEntryName(int resid); 

一對夫婦的其他選項:這些資源ID可以通過名字引用使用。

1)將類包裝成一個管理器,爲您跟蹤信息。

2)通過的所有組件在活動

//make an array list to hold the info 
ArrayList<MyView> ids = new ArrayList<>(); 
//get the window to look through 
ViewGroup viewGroup = (ViewGroup) getWindow().getDecorView(); 
//call things recursively 
findAllViews(viewGroup, ids); 


private static void findAllViews(ViewGroup viewGroup,ArrayList<Integer> ids) { 
    for (int i = 0, n = viewGroup.getChildCount(); i < n; i++) { 
     View child = viewGroup.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      findAllViews((ViewGroup) child, ids); 
     } else if (child instanceof Button) { 
      ids.add((Integer) child.getId()); 
     } 
    } 
} 
+0

尼克迭代。非常感謝澄清,我收到的整數是一個系統級別的整數的ID和如何獲得在視圖組件 - 但這樣做,如果我不知道'整數ID'或'@ + ID/idName',如果你知道我的意思。開發人員將添加自定義組件x次併爲其添加任何ID名稱。只是一個想法,但也許有更好的方式去做這件事?也許庫應該以編程方式將ID分配給自定義按鈕的每個實例?歡呼聲 – ConorBeckett

+0

Nick。它和我一起分享了你正在做的事情,並且我的解決方案能夠發揮作用!我只需要將父活動上下文添加到您的ViewGroup viewGroup =(ViewGroup)activityContext.getWindow()。getDecorView();'行,然後我就可以爲特定的UI組件生成ID整數的ArrayList。非常感謝! – ConorBeckett

+0

太棒了!很高興你理順了。我會編輯我的答案來反映這一點。如果你從一個活動內而不是一個片段調用這個方法,你總是可以使用'this'作爲活動的關鍵字(如果你還不知道的話)。我不明白你的第一個關於編程分配ID的問題?我試圖在編程之前指定ID,並且API 17添加了一個'generateViewID()'方法,以確保您獲得唯一的一個,如果這是您要求的。 – Nick