2014-12-06 100 views
7

我有一个WebView我正在加载一个活动,为了让它预先加载,以便立即弹出不同的Activity(从第一个启动)。是否可以在实例化后更改WebView的上下文?

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

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

它好像当我WebView追加到第二个活动的布局,它的模态得到重视这项活动的窗口,但WebView自身附加到父活动的窗口,因此它显示在一个较高的点层次结构。

如何在WebView实例化后更改Context

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

如果有人可以给我一些见解,我会非常感激。

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

+1

“我必须在活动开始前创建WebViews” - 为什么?是的,“WebView”实例化速度慢。这并不意味着在一项活动中创建一个“WebView”,并着眼于在另一项活动中使用它,这项工作将会发挥作用。为什么不使用片段,并将所有这些都集中在一个单独的活动中?或者,只需在原始活动中准备好时显示“WebView”即可。你为什么觉得你需要两个活动? – CommonsWare 2014-12-06 00:23:27

+0

因为这是作为SDK一部分的活动下降。我将无法访问在生产环境中启动我的活动的活动,因此我必须将Web视图存储在静态类中,并在活动启动后将它们添加到我的布局中。我很想辩论实现的优点,但我必须找到一种方法来完成这项工作,并且我无法启动一个隐藏的活动,并且我无法将内容从一个WebView复制到另一个,从而保留完整的DOM。 – crimulus 2014-12-06 20:29:56

回答

10

您可以尝试创建一个MutableContextWrapper web视图:

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

,后来你可以做

mMutableContext.setBaseContext(newcontext); 

但是......

  • 的WebView是一个非常复杂的组件可能会使用传递的上下文来创建其他对象,如处理程序。 WebView可能会使用这些处理程序将内容发布到原始UI线程,因此最终您可能会看到一个混合了上下文的视图,您知道,双重内存泄漏(如果它可以正常运行)

  • Webview跨越至少1个线程“webcore”,这是行为发生的地方,并且还与......原始UI线程与...处理程序保持通信。通过原始上下文?谁知道!

  • 甚至有2种不同的webview引擎:Kitkat基于铬,而果冻豆和以前的版本使用AOSP/WebView。所以你有一个额外的突破点。

  • 你说的原因不够强大imho。 WebView并不是那么慢。如果你加载的应用程序是,尝试优化它。有很多事情可以做,例如从内部资源加载HTML &图形。

+0

我们已经做了一些非常实质性的优化,但是由于网络瓶颈问题,我们仍然会看到1-1.5秒的加载时间,我们真的希望尽可能让它感觉像原生一样。我们能够在iOS中完成它,所以我别无选择,只能找到一些方法让它在Android中工作。 如果我绝对必须,我会禁用原生选择对话框而选择基于JS的原生选择对话框,但我宁愿不仅仅为了维护目的。这MutableContext是一个奇妙的建议,我一定会尝试一下。 – crimulus 2014-12-06 08:26:21

+0

我对其他实现思路是开放的,但不知何故,我只好在实际显示它的活动出现之前将WebView加载到内存中,而我似乎无法找到在后台加载WebView的方法。如果我可以找到一种方法来启动一个活动而不实际展示任何东西,那么只需创建一种方法在稍后的时间显示该活动,这也可以起作用,但我还无法弄清楚。有人提出了片段,但我仍然需要一个Activity上下文,所以同样的问题在那里。 – crimulus 2014-12-06 08:30:01

+0

我的卑微建议,如果没有深入了解您的应用程序,将会把重点放在问题的根源上,那就是1.5secs的网络瓶颈。你不能以某种方式缓存该内容?将所有内容都带入资产?下载它,然后通过OnInterceptUrlLoad()提供它?任何这些解决方案的方式都会更具可扩展性,我认为WebView可能是您想要将其上下文混淆的最糟糕的视图。 – rupps 2014-12-06 16:25:07

相关问题