是否可以在实例化后更改WebView的上下文?

时间:2014-12-06 00:19:41

标签: android webview

我有一个WebView我正在加载一个活动,以便让它预先加载,以便它立即弹出另一个Activity(从第一个启动)。

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

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

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

如何在Context实例化之后更改WebView?{/ p>

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

如果有人能在这里给我一些见解,我会非常感激。

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

2 个答案:

答案 0 :(得分:12)

您可以尝试使用MutableContextWrapper

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

以后你可以做

mMutableContext.setBaseContext(newcontext);

但是......

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

  • Webview跨越至少1个帖子&#34; webcore&#34;这是动作发生的地方,也是与原始UI线程与...处理程序的持续通信?通过原始背景?谁知道!

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

  • 你说的理由不够强大。 WebView并不那么慢。如果您加载的应用是,请尝试优化它。你可以做很多事情,比如加载HTML&amp;来自内部资产的图形。

答案 1 :(得分:0)

在我的应用程序(它的浏览器)中,我有同样的问题。当用户返回App时,我不喜欢每次都加载WebView。我已经部分解决了这个问题。我在import hashlib import threading #bn=block number d=input data, ph=previous hash bn = 1 d = "mydata" ph = "0000000000000000000000000000000000000000000000000000000000000000" class MyThread(threading.Thread): def __init__(self, threadID, begin, end): threading.Thread.__init__(self) self.threadID = threadID self.end = end self.begin = begin def run(self): for val in range(self.begin, self.end): mine(self.threadID, val) print("done " + str(self.threadID)) #hashing function def mine(id, x): hash = hashlib.sha256((str(bn) + str(x) + str(d) + str(ph)).encode('utf-8')).hexdigest() if hash.find("0000000", 0, 7) > -1: # print(id) print(x) print(hash) #now break it up and distribute it to the threads #Possible SHA256 Combinations 8388608000000 pc = 8388608000000 #Number of desired Threads (more threads help more?) nt = 704 #calculating the steps step = round((pc)/(nt)) #starting the threads with each thread calculating a different range of nonces. for x in range (1, nt): thread = MyThread((x), (x-1)*(step), (x)*(step)) thread.start() 上覆盖了onBackPressed(),并使用HomeActivity代替了moveTaskToBack(true)。因此,当用户在super.onBackPressed()上重新使用系统时,它不会破坏HomeActivity和所有视图。它只是最小化应用程序。外观上是相同的行为,但是如果用户尝试通过启动图标运行App,则所有视图都已加载。我知道这是一个临时解决方案,所有视图都可以随时被系统销毁,但是效果很好。并为我涵盖了很多情况。