Не могу ли я сделать getResources.getString динамически?

Я пытаюсь заполнить Spinner значениями некоторых Strings string.xml . Я пытаюсь сделать так:

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

У меня есть строки, похожие на следующие.

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

И из Geocoder я получаю код страны, такой как AT, BY и т. Д., Которые хранятся в массиве ntpServers. Я хочу заполнить счетчик именем, сохраненным в соответствующей строке, но я не могу сделать getResources().getString(resource) потому что resource – это String не int .

Как я могу это решить?

Спасибо за ваши советы.

PD:

Я получаю следующую последовательность:

Например:

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

Какая строка, которую я хочу в прядильщике.

_ __ _ __ _ __ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Это то, что я пытаюсь сделать сейчас. Я использую 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()))); } 

И это логова кот

 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) 

И это 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; 

Посмотрим, сможешь ли ты мне больше направить.

Вечное Спасибо ^^

Используйте строковый массив, например

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="item"> <item>AT</item> <item>BY</item> <item>BE</item> </string-array> </resources> Resources res = getResources(); String[] array = res.getStringArray(R.array.item); 

Преобразовать массив в список

 List list = Arrays.asList(array); 

/ * В соответствии с вашим требованием * / Для решения вашей проблемы используйте HashMap, которые хранят данные в форме пары значений ключа.

 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()); 

Надеюсь, это решит вашу проблему.

Как мне сказал @Henry, я использовал getIdentifier со следующим кодом:

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

Проблема заключалась в том, что имя ресурса, которое нам нужно найти, не требовало префикса «R.string», только имя.

Спасибо всем.

Вы также можете использовать метод Resources.getIdentifier ( см. Здесь ), который преобразует имя ресурса в идентификатор ресурса int. Однако это медленнее, чем использование массива.

Попробуй это

Массив в strings.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="items"> <item>Austria</item> <item>Belarus</item> <item>Belgium</item> </string-array> </resources> 

Заполнение счетчика

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

Это другое подобное решение, но оно использует класс вспомогательных элементов Collections :

strings.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="countries"> <item>Austria</item> <item>Belarus</item> <item>Belgium</item> </string-array> </resources> 

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

Простой способ получить идентификатор ресурса из строки. Здесь resourceName – это имя ресурса ImageView в папке с возможностью переноса, которая также включена в файл XML.

 int resID = getResources().getIdentifier(resourceName, "id", getPackageName()); ImageView im = (ImageView) findViewById(resID); Context context = im.getContext(); int id = context.getResources().getIdentifier(resourceName, "drawable", context.getPackageName()); im.setImageResource(id); 
Intereting Posts
DialogFragment с пользовательским ListView MVC в Android Да / Нет? Каков наилучший способ организовать приложение, которое взаимодействует с веб-сервисами DrawerLayout – ClassNotFoundException при компиляции с Android Studio и Gradle Android – лучшая практика для повторного запуска IntentService Как удалить фрагмент замененного фрагмента при переходе фрагмента? «Оптимизация» доступа к курсорам в Android: позиции и имена столбцов Как ограничить изменения страницы ViewPager на один за жест Pre-Load или Pre-Buffer .mp4 video в разработке приложений для Android Невозможно использовать XMLGregorianCalendar в Android, даже если он задокументирован? Андроид: выключить экран, когда он близок к лицу В службе биллинга приложений время от времени убивается Как узнать, включены ли «Мобильные сетевые данные» (даже при подключении через WiFi)? Android, значок тревоги в правой части области уведомлений? Android – UI, как скользящая панель уведомлений Как определить количество SIM-карт на устройстве?