我有一个使用自定义异常的应用,例如:
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) - >失败,因为此异常有时会从MODEL类中抛出,因此它们没有Context
2)在getMessage()函数中重写消息时传递“Context”, - >失败,必须覆盖超级方法,才能像其他所有异常一样工作。
我现在拥有的解决方案:我的应用中的所有活动都有onCreate:
public void onCreate(...){
Utils.RESOURCES = getResources();
...
}
非常脏的代码......我不喜欢这个解决方案。那么我的问题是:有没有一种方法可以在没有Context的情况下访问资源?最重要的是,像我这样的应用程序如何解决这个问题?
答案 0 :(得分:4)
怎么样?
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的情况下发出异常,则应该能够在显示此类错误之前访问上下文。我不明白为什么你应该从构造函数创建本地化的错误消息。如果需要,您可以登录到logcat而不是本地化版本。如果你想在UI中显示某些东西,你应该有手头的背景。
答案 1 :(得分:1)
您只能在没有上下文的情况下访问系统范围的资源。
你需要一个Context,所以我建议你尽快得到它,并通过静态方法或变量使它可用。你在每个Activity中做同样的事情,但有一个更干净的方法。您应该创建一个自定义应用程序,并覆盖其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"
...
现在,您无需任何准备即可访问所有活动中的资源。您的自定义Exception类也可以使用外部化资源。