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

Dus*_*Dus 3 android webview

我正在后台加载带有应用程序上下文的WebView ,这样当活动打开时,我们就不会出现加载 WebView 的时间延迟。

我有一个非常简单的 html 文件,加载到 webview 中,并带有选择组件:

<select>
  <option value="name1">value1</option>
  <option value="name2">value2</option>
  <option value="name3">value3</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我在后台启动 webview,并使用应用程序上下文

WebView webView = new WebView(getApplicationContext());
webView.setJavaScriptEnabled(true);
webview.loadUrl("https://www.google.com");
Run Code Online (Sandbox Code Playgroud)

准备好后在活动中将其打开:

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);
Run Code Online (Sandbox Code Playgroud)

Web 视图在活动中打开,但是,选择组件不会打开警报,以便从下拉列表中进行选择。原因是 - 警报仅适用于活动上下文。

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

  1. 尝试更新视图的上下文是不可能的。
  2. 应对观点 - 不可能。
  3. 使用另一个活动启动网络视图,并将其传递给我当前的活动 - 也不起作用。
  4. 尝试调用 invalidate, reload - 不起作用。
  5. 在 Activity 的 onCreate() 中初始化 WebView :WebView webView = new WebView(this);这可行,但加载 WebView 需要时间,这不是我的意图。
  6. 事实上,我以编程方式加载 WebView,而不是使用 xml 布局设置它 - 这不是这里的问题。
  7. 我已经看到这个解决方案:/sf/answers/1962106191/,它也不起作用。

我想强调的是,某种解决方案:不要在后台加载 webview 对我来说是不可能的,所以请不要建议它,我正在寻找适合我的要求的东西。

Dus*_*Dus 5

事实证明,将上下文设置为应用程序上下文时,WebView(或任何其他 ui 组件)不起作用。

不起作用:

WebView webView = new WebView(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

作品:

WebView webView = new WebView(CUURENT_ACTIVITY);
Run Code Online (Sandbox Code Playgroud)

我们不想CURENT_ACTIVITY在使用MutableContextWrapper时使用,它解决了问题(使用应用程序上下文初始化 WebView,当活动打开时,我们使用活动上下文更新上下文)。

内部上下文类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当启动 webview 时,我们使用 mutableContext :

WebView webView = new WebView(InternalContext.getInstance().getMutableContext());
Run Code Online (Sandbox Code Playgroud)

当新活动开始时,我们需要更新基本上下文:

InternalContext.getInstance().setBaseContext(CURRENT_ACTIVITY);
Run Code Online (Sandbox Code Playgroud)