我有一个使用自定义异常的应用,如下所示:
public class SomeException extends Exception{
private int iCode;
private String iMessage;
public SomeException(){
iCode = 201;
iMessage = **//Get the localized string R.string.error_201??**
}
@Override
public String getMessage() {
return iMessage;
}
@Override
public int getCode() {
return iCode;
}
}显然,我希望将错误消息本地化。我有可能的解决方案,但没有一个能让我满意。
1)将" Context“传递给构造函数,并执行ctx.getString(R.string.error_201) -->失败,因为这个异常有时是从模型类抛出的,所以它们没有上下文
2)在getMessage()函数中检索消息时传递"Context“,-->失败,需要重写超方法,才能像其他异常一样工作。
我现在有一个解决方案:我的应用程序中的所有活动都有这个onCreate:
public void onCreate(...){
Utils.RESOURCES = getResources();
...
}非常脏的代码..。我不喜欢这个解决方案。我的问题是:有没有一种方法可以在没有上下文的情况下访问资源?最重要的是,像我这样的应用程序如何解决这个问题?
发布于 2013-05-22 20:48:04
关于
public class MyException extends Exception {
private int iCode;
public MyException(int code) {
this.iCode = code;
}
@Override
public String getMessage() {
return "MyException code " + String.valueOf(iCode);
}
public String getLocalizedMessage(Context ctx) {
String message;
if (iCode == 201)
message = ctx.getString(R.string.error_201);
else if (iCode == 202)
message = ctx.getString(R.string.error_202);
// ...
}
}即使有以不同方式访问上下文的方法,您也不应该这样做。如果您需要在无法传递Context的情况下发出异常,您应该能够在显示此类错误之前访问context。我不明白为什么你要从构造函数中创建本地化的错误消息。如果需要,您可以登录到logcat而不是本地化版本。当你想要在UI中显示一些东西的时候,你应该手头有上下文。
发布于 2014-01-22 19:47:52
您只能在没有上下文的情况下访问系统范围的资源。
您需要一个上下文,所以我建议您尽快获得它,并通过静态方法或变量使其可用。你在每个活动中都做同样的事情,但是有一个更干净的方法。您应该创建一个自定义应用程序,并覆盖其onCreate()以使资源成为公共资源:
public class App extends Application {
private static Resources myResources;
@Override
public void onCreate() {
myResources = getBaseContext().getResources();
super.onCreate();
}
public static Resources getMyResources(){
return myResources;
}
}您必须做的另一件事是在您的清单中设置应用程序:
<application
android:name="{your_package}.App"
...现在,您无需任何准备即可访问所有活动中的资源。您的自定义异常类也可以使用外部化的资源。
https://stackoverflow.com/questions/16691579
复制相似问题