在Android 4.4及更低版本中,我使用以下代码 setAccessible(true)并获取对话框的上下文:
private Context getOriginalContextForDialog(Dialog dialog) {
try {
if (dialog == null || (dialog != null && dialog.getContext() == null)){
return null;
}
Field field = dialog.getContext().getClass().getDeclaredField("mBase");
field.setAccessible(true);
Context value = (Context) field.get(dialog.getContext());
return value;
} catch (Exception e) {
logProc.errSys(LogSubcategory.USER_NOTICE, "Error getting dialog context on UIProcImpl.dismissProgressDialog.", e);
}
return null;
}
这会在Android 5中返回异常,因为找不到“mBase”。我无法找到Android 5上的等价物。我添加了“getDeclaredFields”来查看返回的值。附件是从“getDeclaredFields”返回的数组中的一些数据的屏幕截图。我在Android 4.4的屏幕截图中用红色突出显示了“mBase”。另一个截图来自Android 5,它不包含“mBase”。
Android 5中“mBase”的等价物是什么?或者我应该如何更好地编码以支持4.4和5?
Android 4.4
Android 5
答案 0 :(得分:0)
您可以使用它从对话框中获取基本上下文:
Dialog dialog; // your dialog
Context context = dialog.getContext();
if(context instanceof ContextWrapper)
{
context = ((ContextWrapper)context).getBaseContext();
}
return context;
编辑:
instanceof
运算符用于检查对象是否是类的实例。
示例:
Context context = dialog.getContext();
if(context instanceof ArrayList){ // false because context is not instance of ArrayList
}
Object object = context;
if(object instanceof Context){ // true
}