2009-12-19 30 views
1

我寫了基於ViewSwitcher一個視圖類,現在我想寫助手類像已知形式的視圖ListView控件:ListAdapter,ListActivity等..使用某種形式的「外部ID」爲視圖

關於我遇到問題的活動課。 ListActivity強制你用一個固定的ID爲你的活動添加一個ListView:@id/android:list。在我的基類的活動我要歸檔相同,迫使一個特殊的ID,以便我的助手類可以訪問視圖對象。

正如我寫,可以在不同的項目中使用,我不能使用R.id.foobar得到的觀點,因爲沒有R類別的通用庫。具體項目將自己的R.java。

所以我偷看ListActivity的源代碼,發現:

View emptyView = findViewById(com.android.internal.R.id.empty); 
mList = (ListView)findViewById(com.android.internal.R.id.list); 
if (mList == null) { 
    throw new RuntimeException(
     "Your content must have a ListView whose id attribute is " + 
     "'android.R.id.list'"); 
} 

好吧,我可以寫我的R艙,把它直接進入我的包,並嘗試訪問它以同樣的方式,但我我不知道id應該有什麼價值?

而且我找不到在android_frameworks_base /核心/ JAVA/COM/Android的任何R類別/內部

而且,即使這個問題就解決了:哪有我的自由獲取「我的ID」用戶從他的佈局XML?

感謝您的幫助! :)

回答

0

我不認爲這是安全的,因爲Android已經不提供可重複使用的插件的作者與ID範圍內使用您的預期目的。

相反,請執行下列操作之一:

  1. 讓你的小部件通過在適當的ID的重用器。
  2. 使用Resources#getIdentifier()查找一個ID中給定的名稱的字符串形式R.*「命名空間」。如果你走這條路線,一定要緩存這個結果,因爲看起來顯得有點貴。
+0

謝謝!資源#getIdentifier()是解決此問題的好方法:) – pocmo 2009-12-19 22:59:41

0

如果您正在創建一個圖書館APK其他應用程序可以使用,那麼這個庫的消費者不是指它的資源ID在XML佈局。

當Android應用程序啓動時,它會加載並緩存來自應用程序APK(resources.arsc)的資源信息以及系統資源(即android.R中的資源信息)。 您的應用程序,在一個單獨的過程,並作爲不同的用戶ID運行,則不能直接從其他的APK讀取的資源。但是,如果您只是爲了自己的目的而使用該庫,則應該可以通過使用相同密鑰對它們簽名或在清單中指定相同的進程ID,從而在APK之間獲得更高級別的訪問權限。

0

你可以參考由ContentProvider的通過URI供給的原料資源,我讀到ContentProvider的供應Jpeg格式的出拉鍊的用戶下載在一個單獨的APK。

該uri類似於

android.resource://name.of。component/r_file_id

然後ContentProvider可以將相應的資源文件標識返回給調用應用程序,然後它可以通過URI訪問該文件。

編輯:相同的密鑰可能需要這個工作