2013-03-21 48 views
7

要引用的應用程序的項目中的strings.xml串FOO(在res \值),一個可以簡單地使用如何在代碼中引用Android庫的strings.xml中的字符串?

getString(R.string.foo) 

的getString是背景信息的方法。

假設Android庫在其strings.xml中包含字符串foo。它如何用於圖書館的一種方法?

被修改: 已經建議將上下文的引用傳遞給庫方法,因此可以使用getString()。由於它是應用程序項目的上下文,因此存在以下潛在衝突:

假設: 庫的值爲字符串foo,值爲「庫foo」。 應用程式項目具有值= 「應用foo」 的

以下代碼

Log.d("Debug", "App foo ID: " + R.string.foo); 
Log.d("Debug", "App: foo value: " + getString(R.string.foo)); 

生成一個字符串FOO:

03-22 05:53:55.590: D/Debug(16719): App foo ID: 2131230723 
03-22 05:53:55.590: D/Debug(16719): App foo value: app foo 

在文庫法,下面的代碼

Log.d("Debug", "Library foo ID: " + R.string.foo); 
Log.d("Debug", "Library foo value: " + context.getString(com.my.library.R.string.foo)); 

生成:

03-22 05:55:03.680: D/Debug(16719): Library foo ID: 2131230723 
03-22 05:55:03.680: D/Debug(16719): Library foo value: app foo 

上面顯示ID衝突,因此錯誤的字符串值。

回答

7

正如你所說的引用一個在你的庫中定義的字符串資源,你可以使用getString()方法,你只需要一個Context,但在你的例子中,衝突是由相同的字符串名稱生成的。

當您在庫中定義資源時,如果在應用程序模塊中使用相同的資源名稱,則會發生衝突。爲避免衝突,您必須使用唯一的名稱,例如對庫中的資源名稱使用通用前綴,但不同的程序包名稱是不夠的。

要解決,你可以使用下面的名字:您的圖書館

  • 在你的應用程序從Android文檔

    • mylib_foo

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

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

    • 資源衝突

      由於工具合併庫模塊的資源與那些 一個相關的應用程序模塊中,給定的資源ID可能是在兩個模塊中定義的 。在這種情況下,這些工具從應用程序中選擇資源 ,或者選擇具有最高優先級的庫,並且 丟棄其他資源。在開發應用程序時,請注意 公用資源ID很可能會在多個項目中定義,並將合併,並且應用程序或 的資源優先。

    • 使用前綴來避免資源衝突

      爲了避免公共資源的ID資源衝突,可以考慮使用 前綴或其他一致的命名方案,該方案是獨一無二的 模塊(或者是唯一在所有的項目模塊) 。

  • 4

    一個庫項目應該能夠以完全相同的方式引用它的資源。

    是否有一個特定的用例/代碼示例說明這不起作用?

    在父項目中定義的任何字符串都會覆蓋該庫。即使actionbarsherlock使用前綴ex。 abs__action_bar_home_description

    +1

    的方法不具有上下文參考,如何能的getString()可以使用? – Hong 2013-03-21 21:06:31

    +0

    唯一的方法是與上下文。通常我只是設置我的方法來接受來自調用應用程序的上下文。 – DDRBoxman 2013-03-21 21:12:13

    +1

    您必須將'Context'參數傳遞給您的方法。請注意,'View'有一個'getContext()'方法,如果你已經有了這個類型的參數 – nicopico 2013-03-21 21:15:10

    相關問題