是否可以在实例化 Web 视图后更改其上下文



我有一个WebView,我正在加载一个活动,以便预加载它,以便它立即以不同的Activity弹出(从第一个启动(。

问题是为了实例化WebView,我必须传入一个Context,在这种情况下,它是上面提到的第一个。

所以它工作得很好,第二个Activity显示WebView很好。 问题是,如果我单击WebView中的<select>下拉列表,其选择器对话框将显示在WebView下。感觉选择根本不起作用,直到您点击后退按钮并在返回父活动之前短暂看到选择对话框。

似乎当我将WebView附加到第二个活动的布局时,它的模态会附加到该活动的窗口,但WebView本身附加到父活动的窗口,因此它显示在层次结构中的较高点。

实例

化后,如何更改WebViewContext

这是一个非常难以解决的问题 -- 我必须在活动开始之前创建 WebView,但我还需要选择对话框才能工作。

如果有人能在这里给我一些见解,我将不胜感激。

这是针对 SDK 项目的,因此我无权访问父活动。 此外,saveState 不起作用,因为WebView中显示的大部分内容都是由 JavaScript 生成的,并且完整的 DOM 堆栈不会传输。

您可以尝试使用 MutableContextWrapper 创建 WebView:

MutableContextWrapper mMutableContext=new MutableContextWrapper(context);
WebView mWebView=new WebView(mMutableContext);

以后你可以做

mMutableContext.setBaseContext(newcontext);

但。。。

  • WebView 是一个非常复杂的组件,可能会使用传递的上下文来创建其他对象,如处理程序。 WebView 可能使用这些处理程序将内容发布到原始 UI 线程,因此最后您可能会有一个包含混合上下文的视图,你知道,双内存泄漏(如果它曾经正常工作(

  • Webview 跨越至少 1 个线程"webcore",这是操作发生的地方,并且还与原始 UI 线程保持持续通信......处理器?通过原始上下文?谁知道呢!

  • 甚至还有2种不同的Web视图引擎:Kitkat是基于铬的,而Jelly bean和以前的版本使用AOSP/WebView。所以你还有一个额外的突破点。

  • 恕我直言,您陈述的原因不够充分。WebView并没有那么慢。如果您加载的应用程序是,请尝试对其进行优化。你可以为此做很多事情,比如从内部资产加载HTML和图形。

在我的应用程序(它是浏览器(中,我遇到了同样的问题。我不喜欢每次用户返回应用程序时都加载WebView。我已经部分解决了这个问题。我已经覆盖了HomeActivity上的onBackPressed()并使用moveTaskToBack(true)而不是super.onBackPressed()。因此,当用户重新打开HomeActivity系统时,它不会破坏Activity和所有视图。它只是最小化应用程序。 从视觉上看,这是相同的行为,但如果用户尝试通过启动图标运行应用程序,则所有视图都已加载。我知道这是临时解决方案,系统可以随时销毁所有视图,但它给出了相当好的结果。并为我涵盖了很多案例。

最新更新