Home » Android » android – Cannot I do a getResources.getString dynamically?

android – Cannot I do a getResources.getString dynamically?

Posted by: admin June 15, 2020 Leave a comment


I’m trying to fill a Spinner with the values of some Strings of string.xml. I’m trying to do like that:

   final List<String> list = new ArrayList<String>();
   for (int i = 0; i < 86; i++) {
      String resource = "R.string." + ntpServers[i][0];

I have strings like the next ones.

<string name="AT">Austria</string>
<string name="BY">Belarus</string>
<string name="BE">Belgium</string>

And from a Geocoder I get a country code like AT, BY, etc. Which are stored in the ntpServers array. I want to fill the spinner with the name saved in the correspondent string, but I cannot do getResources().getString(resource) because resource is a String not an int.

How can I solve this?

Thanks for your advices.


I get the next sequence:

For Example:

geocoder.getCountry() = ES --> ntpServers[36][0] = ES --> R.string.ES = """Spain""" 

Which is the string that I want in the spinner.


This is what I’m trying to do now. I’m using getIdentifier.

final List<String> list = new ArrayList<String>();
for (int i = 0; i < 86; i++) {
   String resource = "R.string." + ntpServers[i][0];
   Log.i("RESOURCE", resource);
   Log.i("getResource", "" + getResources().getIdentifier(resource, "string", getPackageName()));
                list.add(getResources().getString(getResources().getIdentifier(resource, "string", getPackageName())));

And this is the log cat

09-18 19:32:43.815: I/RESOURCE(31268): R.string.Global
09-18 19:32:43.815: I/getResource(31268): 0
09-18 19:32:43.815: W/ResourceType(31268): No package identifier when getting value for resource number 0x00000000
09-18 19:32:43.815: D/AndroidRuntime(31268): Shutting down VM
09-18 19:32:43.815: W/dalvikvm(31268): threadid=1: thread exiting with uncaught exception (group=0x40fa92a0)
09-18 19:32:43.815: E/AndroidRuntime(31268): FATAL EXCEPTION: main
09-18 19:32:43.815: E/AndroidRuntime(31268): android.content.res.Resources$NotFoundException: String resource ID #0x0
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.content.res.Resources.getText(Resources.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.content.res.Resources.getString(Resources.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at victor.martin.gplace.MainActivity$3.run(MainActivity.java:790)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.os.Handler.handleCallback(Handler.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.os.Handler.dispatchMessage(Handler.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.os.Looper.loop(Looper.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.app.ActivityThread.main(ActivityThread.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at java.lang.reflect.Method.invokeNative(Native Method)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at java.lang.reflect.Method.invoke(Method.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at dalvik.system.NativeStart.main(Native Method)

And this is the R.java:

public static final class string {
        public static final int AE=0x7f080049;
        public static final int AO=0x7f08005b;
        public static final int Global=0x7f080008;

Let’s see if you can guide me more.

Eternal Thanks ^^

How to&Answers:

Use string-array like

<?xml version="1.0" encoding="utf-8"?>
    <string-array name="item">

Resources res = getResources();
String[] array = res.getStringArray(R.array.item);

convert Array to List

List list = Arrays.asList(array);

/* According to your requirement */
In order to solve your issue use HashMap which keep data in the form of key value pair.

public HashMap<String, String> getCountryCode() {
        HashMap<String, String> countryCode = new HashMap<String, String>();
        countryCode.put("IN", "INDIA");
        countryCode.put("ES", "Spain");
        countryCode.put("USA", "United States of America");

        return countryCode;

String countryName= getCountryCode().get(geocoder.getCountry());

Hope this will solve your problem.


As @Henry advised me, I have used getIdentifier with the next code:

list.add(getResources().getString(getResources().getIdentifier(ntpServers[i][0], "string", getPackageName())));

The problem was that the resource name that we need to find didn’t needed the prefix “R.string”, only the name.

Thanks to all.


You can also use the Resources.getIdentifier method (see here) which converts a resource name to the int resource identifier. However, this is slower than using an array.


Try this

array in strings.xml

<?xml version="1.0" encoding="utf-8"?>
    <string-array name="items">

To populate spinner

Spinner sp = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(ActivityName.this, R.array.item, android.R.layout.simple_spinner_item);


This is another similar solution but it use the Collections helper class:


<?xml version="1.0" encoding="utf-8"?>
    <string-array name="countries">

    String[] countryNames = getResources().getStringArray(R.array.countries);
    List<String> countryList = new ArrayList<String>();

    Collections.addAll(countryList, countryNames); 


A simple way to getting resource ID from string. Here resourceName is the name of resource ImageView in drawable folder which is included in XML file as well.

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",