2013-03-21 31 views
7

は、一つは単にAndroidライブラリのstrings.xmlの文字列をコードで参照するにはどうすればよいですか?

getString(R.string.foo) 

のgetStringは、コンテキストの方法で使用することができるアプリプロジェクトの(RES \値の)のstrings.xmlの文字列のfooを参照します。

Androidライブラリのstrings.xmlに文字列fooがあるとします。ライブラリのメソッドではどのように使用できますか?

編集: Contextのリファレンスをライブラリメソッドに渡して、getString()を使用することをお勧めします。

仮定: ライブラリの値は "library 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()メソッドを使用できます。コンテキストは必要ですが、例では文字列と同じ名前で競合が生成されます。

ライブラリでリソースを定義すると、アプリケーションモジュールで同じ名前のリソースを使用すると競合します。競合を避けるために、ライブラリ内のリソース名に共通のプレフィックスを使用するなど、一意の名前を使用する必要があります。異なるパッケージ名では不十分です。http://developer.android.com/tools/projects/index.html#considerations

:アンドロイドのドキュメントからアプリケーション

ソースに

  • mylib_foo
  • ライブラリ内のfoo:あなたは次の名前を使用することができます解決するには

    • ツールは のそれに依存するアプリケーションとライブラリモジュールのリソースをマージするので、リソースが

      を競合:あなたは、あなたのライブラリモジュールと依存するアプリケーションを開発念頭に置いて下に記載されている ポイントをキープしたよう与えられたリソースIDは両方のモジュールで定義された であるかもしれません。この場合、ツールはアプリケーションからリソース を、または優先度が最も高いライブラリを選択し、 は他のリソースを破棄します。アプリケーションを開発する際には、 に共通のリソースIDが複数の プロジェクトで定義され、アプリケーションからのリソースまたは 優先度の高いライブラリが優先されてマージされることに注意してください。リソースを避けるために

    • 使用プレフィックスは、共通リソースIDのリソースの競合を避ける モジュールに固有の(またはすべてのプロジェクトのモジュール間で一意である)の接頭辞またはその他の一貫性のある命名規則を使用することを検討するために

      を競合します。

4

ライブラリプロジェクトはまったく同じ方法でリソースを参照できるはずです。

これが機能しないことを示す特定のユースケース/コードサンプルはありますか?

親プロジェクトで定義されている文字列は、ライブラリを上書きします。 actionbarsherlockでもプレフィックスexを使います。 abs__action_bar_home_description

+1

このメソッドにはコンテキスト参照がありません。getString()はどのように使用できますか? – Hong

+0

唯一の方法は、コンテキストを使用することです。通常は、呼び出し元のアプリケーションからコンテキストを受け入れるようにメソッドを設定しています。 – DDRBoxman

+1

あなたのメソッドに 'Context'パラメータを渡す必要があります。この型のパラメータをすでに持っているなら、 'View'は' getContext() 'メソッドを持っています。 – nicopico

関連する問題