我正在后台加载一个带有应用程序上下文的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 = new WebView(this);
这是有效的,但加载webview需要时间,而不是我的意图。我想强调一下,排序的解决方案:不要在后台加载webview是不可能的,所以请不要建议,我正在寻找适合我的要求。
答案 0 :(得分:1)
事实证明,在将上下文设置为应用程序上下文时,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);