Android:使用变量名访问string.xml

时间:2011-05-12 15:37:17

标签: android resources

我想根据从程序的其他部分收到的提示向用户显示消息。可以有许多提示&它们存储在枚举中。

以下是我的提示:

Defs.java

public enum Prompt
{
    PromptA,
    PromptB,
    PromptC,
}

我将外化字符串存储在这些行的资源中:

RES /值/ strings.xml中

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

现在,在我的主要活动屏幕中,某个方法会被其他部分调用:

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 个答案:

答案 0 :(得分:20)

请参阅Resources.getIdentifierhttp://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 ,因为包把它放在第三个参数中。

答案 1 :(得分:0)

你可以做的只是将行包含在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 = "";
}

我不在我经常开发的机器上,因此可能会有一些愚蠢的语法错误,但逻辑“应该”有效。