Issue
To reference string foo in strings.xml (in res\values) of an app project, one can simply use
getString(R.string.foo)
getString is a method of Context.
Suppose an Android library has a string foo in its strings.xml. How can it be used in a method of the library?
Edited: It has been suggested to pass a reference of Context to the library method so getString() can be used. Since it is a context of an app's project, there is potential conflict that can be illustrated as following:
Suppose: The library has a string foo with value = "library foo". An app project has a string foo with value = "app foo"
The following code
Log.d("Debug", "App foo ID: " + R.string.foo);
Log.d("Debug", "App: foo value: " + getString(R.string.foo));
generates:
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
In a library method, the following code
Log.d("Debug", "Library foo ID: " + R.string.foo);
Log.d("Debug", "Library foo value: " + context.getString(com.my.library.R.string.foo));
generates:
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
The above shows the ID conflict hence erroneous string value.
Solution
As you indicated to reference a string resource defined in your library you can use getString() method, you only need a Context, but in your example the conflict is generated by the same name of the strings.
When you define a resource in your library you have a conflict if you use the same name of a resource in the application module. To avoid conflicts you have to use unique names, for example using a common prefix for resource names in the library, it is not sufficient the different package name.
To resolve you can use the following names:
- mylib_foo in your library
- foo in your application
Source from android documentation: http://developer.android.com/tools/projects/index.html#considerations
As you develop your library modules and dependent applications, keep the points listed below in mind:
Resource conflicts
Since the tools merge the resources of a library module with those of a dependent application module, a given resource ID might be defined in both modules. In this case, the tools select the resource from the application, or the library with highest priority, and discard the other resource. As you develop your applications, be aware that common resource IDs are likely to be defined in more than one project and will be merged, with the resource from the application or highest-priority library taking precedence.
Use prefixes to avoid resource conflicts
To avoid resource conflicts for common resource IDs, consider using a prefix or other consistent naming scheme that is unique to the module (or is unique across all project modules).
Answered By - mpolci
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.