Since Android makes the R
class automatically with resource files under the /res
folder, using the R
class as final static
is impossible.
I found a nice solution to use a jar
file with the res
files. Here is how I did it:
-
In your source code which will be exported in the
jar
file, don’t useR
variable because it will be replaced with a final static memory address in compile time.
Instead of usingR
, I made my own method below:public static int getResourceIdByName(String packageName, String className, String name) { Class r = null; int id = 0; try { r = Class.forName(packageName + ".R"); Class[] classes = r.getClasses(); Class desireClass = null; for (int i = 0; i < classes.length; i++) { if (classes[i].getName().split("\\$")[1].equals(className)) { desireClass = classes[i]; break; } } if (desireClass != null) { id = desireClass.getField(name).getInt(desireClass); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return id; }
For example, if you have a layout named
main.xml
, you can get it by calling the method:int id = getResourceIdByName(context.getPackageName(), "layout", "main");
If you have a string whose
id
is “text1”, you can get it by calling methodint id = getResourceIdByName(context.getPackageName(), "string", "text1");
This method gives you your resource id at runtime. It uses the reflection API to get the status of
R
at runtime.By using this method you can avoid using the
R
variable. -
Copy your
res
files to your target project. -
Build.