在Android 5上替代getDeclaredField(“mBase”)

时间:2015-07-13 20:21:32

标签: android android-context android-dialog

在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 4.4

Android 5 Android 5

1 个答案:

答案 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 

}