13

アプリプロジェクトのstrings.xml(res \ values内)で文字列fooを参照するには、次のように簡単に使用できます。

getString(R.string.foo)

getStringはContextのメソッドです。

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

編集:getString()を使用できるように、コンテキストの参照をライブラリメソッドに渡すことが提案されています。これはアプリのプロジェクトのコンテキストであるため、次のように説明できる潜在的な競合があります。

仮定:ライブラリに、値が「libraryfoo」の文字列fooがあります。アプリプロジェクトには、値が「appfoo」の文字列fooがあります

次のコード

Log.d("Debug", "App foo ID: " + R.string.foo);  
Log.d("Debug", "App: foo value: " + getString(R.string.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の競合、つまり誤った文字列値を示しています。

4

3 に答える 3

8

ライブラリで定義された文字列リソースを参照するように指定したように、getString()メソッドを使用できます。必要なのはコンテキストのみですが、この例では、競合は同じ名前の文字列によって生成されます。

ライブラリでリソースを定義するときに、アプリケーションモジュールで同じ名前のリソースを使用すると、競合が発生します。競合を回避するには、一意の名前を使用する必要があります。たとえば、ライブラリ内のリソース名に共通のプレフィックスを使用する場合、異なるパッケージ名では不十分です。

解決するには、次の名前を使用できます。

  • ライブラリ内のmylib_foo
  • アプリケーションのfoo

Androidドキュメントからのソース:http://developer.android.com/tools/projects/index.html#considerations

ライブラリモジュールと依存アプリケーションを開発するときは、以下の点に注意してください。

  • リソースの競合

    ツールはライブラリモジュールのリソースを依存アプリケーションモジュールのリソースとマージするため、特定のリソースIDが両方のモジュールで定義される場合があります。この場合、ツールはアプリケーションまたは最も優先度の高いライブラリからリソースを選択し、他のリソースを破棄します。アプリケーションを開発するときは、共通のリソースIDが複数のプロジェクトで定義される可能性が高く、アプリケーションまたは最も優先度の高いライブラリのリソースが優先されてマージされることに注意してください。

  • リソースの競合を回避するためにプレフィックスを使用する

    共通のリソースIDのリソースの競合を回避するには、モジュールに固有の(またはすべてのプロジェクトモジュールに固有の)プレフィックスまたはその他の一貫した命名スキームを使用することを検討してください。

于 2015-03-13T22:08:29.023 に答える
5

ライブラリプロジェクトは、まったく同じ方法でそのリソースを参照できる必要があります。

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

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

于 2013-03-21T21:00:39.363 に答える
2
//For boolean values
    int resId = context.getResources().getIdentifier("bool_ID", "bool", context.getPackageName());
    if(resId != 0){
       System.out.println(context.getResources().getBoolean(resId));
    }

    //For String values
    int resStringId = context.getResources().getIdentifier("string_ID", "string", context.getPackageName());
    if(resStringId != 0){
        System.out.println(context.getResources().getString(resStringId));
    }
于 2020-06-24T04:57:58.020 に答える