使用应用程序上下文启动时,Webview不会打开选择的html组件(下拉列表)

时间:2017-12-12 14:03:59

标签: android webview

我正在后台加载一个带有应用程序上下文的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将在活动中打开,但是,选择组件不会打开警报,以便从下拉列表中进行选择。 原因是 - 警报仅适用于活动上下文。

这是我到目前为止所尝试的内容:

  1. 尝试更新视图的上下文是不可能的。
  2. 处理视图 - 不可能。
  3. 使用其他活动启动webview,并将其传递给我当前的活动 - 也不起作用。
  4. 尝试调用invalidate,重新加载 - 不起作用。
  5. 在活动的onCreate()中初始化WebView:WebView webView = new WebView(this);这是有效的,但加载webview需要时间,而不是我的意图。
  6. 我正在以编程方式加载WebView,而不是使用xml布局设置它 - 这不是问题所在。
  7. 我已经看到了这个解决方案:https://stackoverflow.com/a/28030088/5130239,它也没有用。
  8. 我想强调一下,排序的解决方案:不要在后台加载webview是不可能的,所以请不要建议,我正在寻找适合我的要求。

1 个答案:

答案 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);