Android-在使用应用程序上下文创建活动后,如何将WebView附加到活动

Android-在使用应用程序上下文创建活动后,如何将WebView附加到活动,android,webview,mutable-context-wrapper,Android,Webview,Mutable Context Wrapper,我正在使用应用程序上下文在后台创建一个Android WebView,以便在需要显示时加载并准备就绪。当需要时,我使用addView将其附加到我的活动。这通常非常有效,但是当我尝试打开HTML select下拉列表时,我遇到了一个崩溃: 我假设这是因为我使用ApplicationContext创建了WebView。我的问题是:有没有办法解决这个问题?有没有办法将现有WebView“附加”到其他活动或窗口,以便创建对话框?有没有办法通过在运行时更改上下文来使用反射来“破解”这一问题 编辑:正如下面

我正在使用应用程序上下文在后台创建一个Android WebView,以便在需要显示时加载并准备就绪。当需要时,我使用addView将其附加到我的活动。这通常非常有效,但是当我尝试打开HTML select下拉列表时,我遇到了一个崩溃:

我假设这是因为我使用ApplicationContext创建了WebView。我的问题是:有没有办法解决这个问题?有没有办法将现有WebView“附加”到其他活动或窗口,以便创建对话框?有没有办法通过在运行时更改上下文来使用反射来“破解”这一问题


编辑:正如下面所建议的,我使用了一个测试,它似乎很好地解决了这个问题

因此,我们实际上遇到了同样的问题(在保留的
片段中使用
WebView
来防止页面重新加载,同时不泄漏
活动
上下文),简单的回答似乎是没有真正干净的方法来做到这一点。我甚至尝试了一个自定义的
WebView
子类,该子类返回了主机
Activity
的窗口标记,而不是
WebView
自己的标记,但没有成功

正如您所建议的,我们最终使用反射来修改底层上下文:

public static boolean setContext(View v, Context ctx) {
    try {
        final Field contextField = View.class.getDeclaredField("mContext");
        contextField.setAccessible(true);
        contextField.set(v, ctx);
        return (v.getContext() == ctx);
    } catch (IllegalAccessException | NoSuchFieldException e) {
        Log.e(TAG, String.valueOf(e), e);
        return false;
    }
}
它只是在
视图
实例上设置
mContext
字段,如果成功修改,则返回true。然而,我最近看到了另一个建议(而且我还没有测试这个,所以YMMV)使用
MutableContextWrapper
。因此,您可以使用
活动
上下文
网络视图
进行充气,并将其包装在
可变上下文包装器
中。然后,当您需要释放上一个引用时,您可以将
WebView
Context
转换为
MutableContextWrapper
,然后将基本
Context
设置为新的
活动。所以像这样的东西可以膨胀布局:

MutableContextWrapper contextWrapper = new MutableContextWrapper(activity);

WebView webView = (WebView) LayoutInflater.from(contextWrapper)
        .inflate(R.layout.your_webview_layout, theParent, false);
然后,要重新附加到新的
活动

if (webView.getContext() instanceof MutableContextWrapper) {
    ((MutableContextWrapper) webView.getContext()).setBaseContext(newActivity);
}

在写了这个问题之后,我使用反射测试了一个解决方案,它似乎是有效的(尽管我不得不在使用ChromiumWebView的Android 4.4上进行更深层次的测试)。感谢您指出MutableContextWrapper,我不知道这个类,看起来它可以做到这一点!我会尝试一下,然后再报告。MutableContextWrapper似乎很好地解决了这个问题,我会用这个事实更新这个问题,再次感谢!
if (webView.getContext() instanceof MutableContextWrapper) {
    ((MutableContextWrapper) webView.getContext()).setBaseContext(newActivity);
}