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 

}