Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use dynamic R strings in Android

I'm having a problem using strings stored in my strings.xml, I have a wide list of strings stored there. They are very useful for me because I'm using them to translate my program. However, now I want to choose between those strings dynamically and I don't know how to do it. It will be easier to understand with an example. Let's assume that I have the following strings:

<string name="red">Red</string>
<string name="blue">Blue</string>
<string name="green">Green</string>
<string name="yellow">Yellow</string>

And now let's assume that I have a function that passes me a string with a color, for example "yellow". Now I only have a solution for this, to make a very huge switch (very very huge, because I have lots of strings), I think that there must be an option to transform the output of my function into the right parameter. I mean, if I have a function that returns me "yellow", and I want to use R.strings.yellow, there must be a link between them. I don't know if maybe you could use any kind of reflection to achieve this.

Can you help me?

like image 356
user2204353 Avatar asked Sep 09 '13 21:09

user2204353


3 Answers

There's a way 10 times faster than regular android method "getIdentifier" to get the value from not only string but also drawable or any other resource existing in the R file in a very simple manner using reflection as follows:

try {
        //Get the ID
        Field resourceField = R.string.class.getDeclaredField("yourResourceName");
        //Here we are getting the String id in R file...But you can change to R.drawable or any other resource you want...
       int resourceId = resourceField.getInt(resourceField);

       //Here you can use it as usual
       String yourString = context.getString(resourceId);

    } catch (Exception e) {
        e.printStackTrace();
    } 

Hope this helps.

Regards!

like image 113
Martin Cazares Avatar answered Oct 04 '22 07:10

Martin Cazares


Use a two-step process to find the id to load. First use Resources.getIdentifier(), for example:

int id = getResources().getIdentifier("yellow", "string", getPackageName());

Then, after checking the id is not zero (which indicates it could not find the resource), use the id to get a string like normal:

String colour = getString(id);
like image 42
Logan Pickup Avatar answered Oct 04 '22 05:10

Logan Pickup


String mystring = getResources().getString(R.string.yellow);
like image 45
EresDev Avatar answered Oct 04 '22 06:10

EresDev