Eclipse/Java - R.string中的值.*return int?

Jam*_*add 63 java string resources android

我以为我会很优雅并使用string.xml文件为异常消息之类的东西定义一些常量字符串.在strings.xml中,我点击Add,选择"String"选项(不是'String Array'),然后给它一个名称和值.我很惊讶地发现这段代码不起作用:

throw new Exception(R.string.MyExceptionMessage);
Run Code Online (Sandbox Code Playgroud)

这失败了,因为R.string.MyExceptionMessage实际上是int类型.我可以通过查看R.java来验证该类型.我错过了什么?

Chr*_*Orr 115

R类中的所有内容都是引用,因此它只是定义为int.

如果您的代码在Android中运行 - 或者可以访问 - Context,您可以调用context.getString(R.string.my_exception_message)以获取实际String值.

或者,对于不需要翻译的异常字符串这样的事情,因此不需要在Android资源.xml文件中严格定义,您可以将字符串存储为某种StringConstants界面中的常量.这样,您可以引用可能无法访问的实用程序类中的字符串Context.

  • 克里斯在两个账户上都是对的.Context.getString加载您的字符串资源.但要注意将不可本地化的东西放在那里,因为它会混淆你的字符串进行翻译.我不认为它是优雅的,但必须将您的UI字符串放在XML文件而不是代码中.在某些时候,您需要将您的应用程序分发到其他国家/地区,并且要将它们从代码中分离出来需要付出很多努力.立即行动,避免头痛.我在中国有一个经销商我只是给她发送strings.xml进行翻译,不费吹灰之力.此致,Ari (9认同)

ski*_*don 32

使用"getResources().getString(id)"方法.

  getResources().getString(R.string.title_activity)
Run Code Online (Sandbox Code Playgroud)

和繁荣,你有你的字符串.请确保将该字符串存储在values文件夹的string.xml文件中.


Pin*_*San 5

克里斯是对的.但是如果你想要本地化Exception字符串该怎么办呢.例如,您抛出一个Exception,当您捕获它时,您希望向用户显示异常消息.我想把它们放在strings.xml中,但同时我不想使用这段代码

throw new Exception(context.getString(R.string.my_exception_message))
Run Code Online (Sandbox Code Playgroud)

因为我认为如果你有一个Exception可能你不想要,你不能使用一些额外的代码来获取异常消息.

我认为唯一的解决方案是在主Activity中为此消息声明一个静态String并尽快初始化它(例如在onCreate()方法中),如下所示:

private static String my_exception_message;

public onCreate()
{
    my_exception_message = context.getString(R.string.my_exception_message);
}
Run Code Online (Sandbox Code Playgroud)

因此,当您抛出异常时,您已准备好使用本地化消息.你认为呢?你能想到其他一些解决方案吗?