2011-11-24 42 views
5

Android的documentation告訴我,我可以從另一個包通過「包名」,這意味着什麼訪問字符串:如何使用Android中的XML從庫中的其他包引用字符串?

@[<package_name>:]<resource_type>/<resource_name> 

所以在我的清單我要訪問我已經放在一個字符串在一個單獨的庫項目,在com.globalmentor.android package ---這就是我的R類的,畢竟:

<activity 
     android:label="@com.globalmentor.android:string/app_applicationlistactivity_label" 
     android:name="com.globalmentor.android.app.ApplicationListActivity" > 
    </activity> 

這還不編譯。但是這樣做:

<activity 
     android:label="@string/app_applicationlistactivity_label" 
     android:name="com.globalmentor.android.app.ApplicationListActivity" > 
    </activity> 

爲什麼? Android文檔對於「package_name」的含義是什麼意思?爲什麼第一個例子不工作,爲什麼第二個例子工作?我不希望所有的資源名稱都合併到同一個R文件中---我希望將它們分區到軟件包中,就像我寫的那樣。

回答

3

簡而言之:軟件包名稱前綴用於共享庫,不適用於您的apk。

的文件上寫着:

要引用系統資源,你需要包括包名

這與外部共享庫(及其資源),您的應用程序與(例如地圖)相關聯。他們有他們自己的R類,沒有和你的應用程序合併。

這些都是你在android清單部分提到的所有標準的android包和共享庫。

正如Nikolay指出的那樣,所有應用程序資源都已合併,這就是爲什麼大多數庫項目使用前綴如abs__作爲其資源名稱的原因。

請參閱Library projects doc瞭解更多信息。

1

無論您是否喜歡,圖書館項目資源都將合併到應用程序項目資源中,與應用程序項目中的同名資源重寫庫項目的資源。查看應用程序項目中的R.java文件以確認。

您可以通過使用@android:string/foo('android'包)來訪問公開導出的框架資源,但我不認爲您可以從像這樣的庫項目中導出資源。

+1

認真嗎?如果所有名稱仍然發生衝突,那麼使用'com.myapp.R'和'com.library.R'有什麼意義?所以我必須使用'com.example.foo.R.id.com_example_foo_bar'而不是'com.example.foo.R.id.bar'來防止名稱在合併時發生衝突?多麼愚蠢。 –

+2

所以當它說「package_name」時,仍然不知道文檔是什麼意思(參見原始問題)? –

2

爲什麼?

因爲您已將該庫項目添加到您的項目中,所以Android會合並這些資源,因此最後生成的項目會「贏得」該名稱。出於這個原因,爲資源添加前綴是個好主意。在這種情況下,不能使用「package_name」,因爲您在自己的項目中擁有這些資源。我想這是你的情況,因爲它編譯時沒有包名。

如果您沒有將該庫項目添加到您的項目中,則可能的解決方案是使用SharedUserId。

來源:http://developer.android.com/tools/projects/index.html

發展的考慮

當你開發你的庫項目及相關應用程序,保持 記住下列幾點:

  • 資源衝突,由於工具合併一個庫項目的資源與一個依賴應用程序項目的資源相關,給定的資源ID可以在這兩個項目。在這種情況下,工具 將從應用程序中選擇資源,或者選擇最高優先級爲 的庫,並丟棄其他資源。在開發您的應用程序時,請注意,在多個項目中定義的公用資源ID可能爲 ,並且將合併,應用程序或最高優先級庫中的資源 優先。
  • 使用前綴來避免資源衝突爲避免資源衝突的公共資源ID,請考慮使用前綴或其他一致的 命名方案,該項目是唯一的(或在所有 項目中唯一)。
0

名稱你在你的包作爲com.globalmentor.android.app_applicationlistactivity_lab資源,而不僅僅是app_applicationlistactivity_lab。

<?xml version="1.0" encoding="utf-8"?> <resources> .... <string name="com.globalmentor.android.app_applicationlistactivity_lab">...</string>
.... </resources>

然後你就可以通過

getResources().getString(R.string.com_globalmentor_android_app_applicationlistactivity_lab);

從XML訪問它

"@string/com.globalmentor.android.app_applicationlistactivity_lab"

和程序沒有衝突。

相關問題