Dynamic Resource Loading Android
I'm trying to find a way to open resources whose name is determined at runtime only.
More specifically, I want to have a XML that references a bunch of other XML files in the application apk. For the purpose of explaining, let's say the main XML is main.xml
and the other XML are file1.xml
, file2.xml
and fileX.xml
. What I want is to read main.xml
, extract the name of the XML I want (fileX.xml
), for example, and then read fileX.xml
. The problem I face is that what I extract form main.xml
is a string and I can't find a way to change that to R.raw.nameOfTheFile
.
Anybody has an idea?
I don't want to:
- regroup everything in one huge XML file
- hardcode main.xml in a huge switch case that links a number/string to the resource ID
Solution 1:
I haven't used it with raw files or xml layout files, but for drawables I use this:
getResources().getIdentifier("fileX", "drawable","com.yourapppackage.www");
to get the identifier (R.id) of the resource. You would need to replace drawable with something else, maybe raw
or layout
(untested).
Solution 2:
I wrote this handy little helper method to encapsulate this:
public static String getResourceString(String name, Context context) {
int nameResourceID = context.getResources().getIdentifier(name, "string", context.getApplicationInfo().packageName);
if (nameResourceID == 0) {
throw new IllegalArgumentException("No resource string found with name " + name);
} else {
return context.getString(nameResourceID);
}
}
Solution 3:
There is another method:
int drawableId = R.drawable.class.getField("file1").getInt(null);
According to this blog it's 5x times faster than using getIdentifier.