【问题标题】:How to get activity of a DecorVIew? .getContext() on DecorView getting a DecorContext如何获得 DecorVIew 的活动? DecorView 上的 .getContext() 获取 DecorContext
【发布时间】:2016-08-31 19:14:39
【问题描述】:

在 Android 7 上,获取 DecorView 的上下文会返回 DecorContext 类,它不是 Activity。我曾经使用 Activity a = (Activity)view.getContext() 获取活动,但它不再适用于 Android 7 上的 DecorView。有什么有效的方法可以从 DecorView 获取活动?

我现在使用反射来获取DecorView的窗口,然后获取该窗口的上下文(这是一个Acitivity)。

Field f = decorView.getClass().getDeclaredField("mWindow");
f.setAccessible(true);
Window w = (Window) f.get(decorView);
Activity a = (Activity) w.getContext();

有没有使用标准API的方法?

【问题讨论】:

    标签: android android-activity android-context android-7.0-nougat


    【解决方案1】:

    在 Android 7 (Nougat) 中,Android 引入了多窗口功能,使您可以在屏幕上一次打开 2 个活动(无论是您的活动还是 2 个不同的活动)。为此,他们引入了一个名为DecorContext 的新类,供DecorView 使用。 DecorContext 是(引用)“装饰视图的上下文,可以使用纯应用程序上下文播种并且不依赖于活动,但仍提供一些设施活动具有例如主题、基于活动的资源等”。这意味着DecorView 不再知道它与哪个Activity 相关,只知道与哪个Application 相关。因此,从 Nougat 开始,一个人无法单独从 DecorView 获得 Activity

    不确定它是否仍然与您相关,但您可以这样做:

    Activity a = (Activity) decorView.findViewById(android.R.id.content).getContext();
    

    【讨论】: