Android 上 getDeclaredField("mBase") 的替代方法 5
Alternative to getDeclaredField("mBase") on Android 5
在 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;
}
这 returns 是 Android 5 中的异常,因为未找到 "mBase"。我找不到 Android 5 上的等效项。我添加了 "getDeclaredFields" 以查看返回的值。附件是从 "getDeclaredFields" 返回的数组中的一些数据的屏幕截图。我在显示 "mBase" 的 Android 4.4 的屏幕截图中用红色突出显示。另一张截图来自 Android 5,不包括 "mBase".
"mBase" 在 Android 5 中的等价物是什么?或者我应该如何更好地对此进行编码以同时支持 4.4 和 5?
Android 4.4
Android 5
您可以使用它从对话框中获取基本上下文:
Dialog dialog; // your dialog
Context context = dialog.getContext();
if(context instanceof ContextWrapper)
{
context = ((ContextWrapper)context).getBaseContext();
}
return context;
编辑:
instanceof
运算符用于检查对象是否是 class.
的实例
示例:
Context context = dialog.getContext();
if(context instanceof ArrayList){ // false because context is not instance of ArrayList
}
Object object = context;
if(object instanceof Context){ // true
}
在 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;
}
这 returns 是 Android 5 中的异常,因为未找到 "mBase"。我找不到 Android 5 上的等效项。我添加了 "getDeclaredFields" 以查看返回的值。附件是从 "getDeclaredFields" 返回的数组中的一些数据的屏幕截图。我在显示 "mBase" 的 Android 4.4 的屏幕截图中用红色突出显示。另一张截图来自 Android 5,不包括 "mBase".
"mBase" 在 Android 5 中的等价物是什么?或者我应该如何更好地对此进行编码以同时支持 4.4 和 5?
Android 4.4
Android 5
您可以使用它从对话框中获取基本上下文:
Dialog dialog; // your dialog
Context context = dialog.getContext();
if(context instanceof ContextWrapper)
{
context = ((ContextWrapper)context).getBaseContext();
}
return context;
编辑:
instanceof
运算符用于检查对象是否是 class.
示例:
Context context = dialog.getContext();
if(context instanceof ArrayList){ // false because context is not instance of ArrayList
}
Object object = context;
if(object instanceof Context){ // true
}