我正在使用应用程序上下文,在后台加载WebView,因此当活动打开时,我们不会有时间延迟加载WebView。
我有一个非常简单的html文件,加载在WebView中,并带有SELECT组件:
<select>
<option value="name1">value1</option>
<option value="name2">value2</option>
<option value="name3">value3</option>
</select>
我在背景中启动WebView,并使用应用程序上下文
WebView webView = new WebView(getApplicationContext());
webView.setJavaScriptEnabled(true);
webview.loadUrl("https://www.google.com");
准备就绪后将其打开:
:LinearLayout root = new LinearLayout(this);
root.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
root.setOrientation(LinearLayout.VERTICAL);
root.addView(webView);
setContentView(root);
WebView在活动中打开,但是,选择的组件不会打开警报,以从下拉列表中挑选。原因是 - 警报仅适用于活动上下文。
这是我到目前为止尝试的:
- 试图更新视图的上下文是不可能的。
- 无法应对视图 -
- 使用另一项活动启动WebView,并将其传递给我当前的活动 -
- 尝试调用无效,重新加载 - 不起作用。
- 活动:
WebView webView = new WebView(this);
的intreate()中的init webview,但它需要时间才能加载,这不是我的意图。 - 我正在以编程方式加载WebView,而不是使用XML布局进行加载 - 这不是这里的问题。
- 我已经看到了此解决方案:https://stackoverflow.com/a/28030088/5130239,它也不起作用。
我想强调,这是一个排序的解决方案:不要在背景中加载网络浏览量,所以请,请不要建议它,我正在寻找对于适合我要求的东西。
事实证明,将上下文设置为应用程序上下文时,WebView(或任何其他UI组件)无效。
不起作用:
WebView webView = new WebView(getApplicationContext());
作品:
WebView webView = new WebView(CUURENT_ACTIVITY);
使用MutabLeContextWrapper时,我们不想使用CURENT_ACTIVITY
,该问题解决了问题(使用应用程序上下文启动WebView,并且当活动打开时,我们正在使用活动上下文更新上下文)。
internalContext类:
class InternalContext {
private static InternalContext instance;
private MutableContextWrapper mutableContext;
protected static InternalContext getInstance() {
if (instance == null) {
instance = new InternalContext();
}
return instance;
}
protected void setBaseContext(Context context) {
mutableContext.setBaseContext(context.getApplicationContext());
}
protected MutableContextWrapper getMutableContext() {
return mutableContext;
}
}
启动WebView时,我们正在使用mutableContext:
WebView webView = new WebView(InternalContext.getInstance().getMutableContext());
当新活动开始时,我们需要更新基本上下文:
InternalContext.getInstance().setBaseContext(CURRENT_ACTIVITY);