Как получить доступ к строке, используя динамическое строковое имя в Android (аналогично eval в javascript)?

#java #android

#java #Android

Вопрос:

Я пытаюсь получить доступ к строковым переменным, используя динамические имена, в зависимости от того, в какой позиции находится моя галерея. Чтобы получить значение строки, используя фиксированное имя, я использую следующее, которое подходит (строка называется pic1info):

 String strTest = getResources().getString(R.string.pic1info);  
  

Мои строки называются pic1info, pic2info, pic3info и т.д., И я хочу заменить статическое определение pic1info, включающее позицию, поэтому передайте содержимое следующей строки вместо pic1info выше, чтобы она возвращала другую строку в зависимости от текущей позиции:

 String strDynamicStringName= "pic"   position   "info";
  

В javascript эквивалентом было бы eval , я уверен, что есть простой способ сделать это, но я не могу понять, как!

Большое спасибо за вашу помощь, как всегда!

Дэйв

Ответ №1:

используйте это: android.content.res.Resources.getIdentifier

 int resID = getResources().getIdentifier("pic"   position   "info", "string", getPackageName());
String strTest = getResources().getString(resID);
  

Комментарии:

1. Этот ответ намного медленнее, поскольку он потребует использования отражения в Java. Будьте очень осторожны, используя этот метод в производственном коде.

Ответ №2:

Нет, простого способа сделать это в Java нет, но вы можете создать массив целых чисел, где каждый индекс представляет R-значение этой строки.

 private static final int[] LOOKUP_TABLE = new int[] {
   R.string.pic1info,
   R.string.pic2info,
   R.string.pic3info,
   R.string.pic4info
};
  

Получение строки тогда стало бы:

 String strTest = getResources().getString(LOOKUP_TABLE[position]);  
  

Ответ №3:

Вдохновленный ответом Kaj, вы также можете поместить массив строк в свой XML-файл:

 <resources>
    <string-array name="picInfos">
        <item>value of pic1info goes here</item>
        <item>value of pic2info goes here</item>
        <item>value of pic3info goes here</item>
    </string-array>
</resources>