Android: доступ к string.xml по имени переменной - PullRequest
11 голосов
/ 12 мая 2011

Я хочу отобразить сообщение для пользователя в зависимости от запроса, полученного из другой части программы.Может быть несколько подсказок, и они хранятся в перечислении.

Это мои подсказки:

Defs.java

public enum Prompt
{
    PromptA,
    PromptB,
    PromptC,
}

У меня есть внешние строки, хранящиеся в ресурсах в этих строках:

res / values ​​/ strings.xml

<string name="PromptA">Error in execution</string>
<string name="PromptB">Process completed successfully</string>
<string name="PromptC">Please try again</string>

Теперь в моей основной деятельности screen метод вызывается какой-то другой частью:

public void showPrompt(Prompt prompt) {
    String message = getString(R.string.<**what-do-I-put-here?**>);
    //show a dialog box with message
}

Я знаю, что это можно сделать с помощью огромного блока if-else (в реальном приложении есть тонны подсказок) или оператора switch.Это будет действительно ужасно.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

20 голосов
/ 12 мая 2011

См. Resources.getIdentifier: http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29. Вы можете попробовать что-то вроде этого:

public void showPrompt(Prompt prompt, String label) {
    String message = (String) getResources().getText(getResources().getIdentifier(label, "string", null));
    //show a dialog box with message
}

Попробуйте и посмотрите, что это для вас делает.

РЕДАКТИРОВАТЬ: Мех. Попробуйте вместо этого.

public void showPrompt(Prompt prompt, String label) {
    String message = (String) getResources().getText(getResources().getIdentifier(label, "string", "<application package class>"));
    //show a dialog box with message
}

Оказывается, вы должны указать идентификатор вашего пакета (поэтому, если ваш AndroidManifest.xml имеет com.blah.blah.blah в качестве пакета, укажите это в третьем параметре.

0 голосов
/ 12 мая 2011

Что вы можете сделать, это просто заключить строку в оператор if / else if / else или переключатель.

String message;
switch(prompt) {
case PromptA:
    message = getString(R.string.PromptA);
    break;
case PromptB:
    message = getString(R.string.PromptB);
    break;
case PromptC:
    message = getString(R.string.PromptC);
    break;
default:
    message = "";
}

Я не на машине, на которой я обычно разрабатываю, так что там может быть какая-то глупая синтаксическая ошибка, но логика должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...