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

标签 android webview

我正在加载 WebView与应用程序上下文一起在后台运行,这样当 Activity 打开时,我们就不会出现加载 Web View 的时间延迟。

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

<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");

准备好后在 Activity 中将其打开:

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 在 Activity 中打开,但是,选择组件不会打开警报,以便从下拉列表中进行选择。 原因是 - 警报仅适用于 Activity 上下文。

这是我迄今为止尝试过的:

  1. 无法尝试更新 View 的上下文。
  2. 处理 View - 不可能。
  3. 使用另一个 Activity 启动 Web View ,并将其传递给我当前的 Activity - 效果不佳。
  4. 尝试调用 invalidate, reload - 不起作用。
  5. 在 Activity 的 onCreate() 中初始化 WebView:WebView webView = new WebView(this); 这可行,但加载 webview 需要时间,这不是我的 Intent 。
  6. 事实上,我以编程方式加载 WebView,而不是使用 xml 布局设置它 - 这不是这里的问题。
  7. 我已经看到了这个解决方案:https://stackoverflow.com/a/28030088/5130239 ,也没有用。

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

最佳答案

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

不起作用:

WebView webView = new WebView(getApplicationContext());

作品:

WebView webView = new WebView(CUURENT_ACTIVITY);

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

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());

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

InternalContext.getInstance().setBaseContext(CURRENT_ACTIVITY);

关于android - 使用应用程序上下文启动 Webview 时,未打开选择 html 组件(下拉列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47774536/

相关文章:

java - NoClassDefFoundError : . .. 将 Robolectric 与 Android 库 (AAR) 结合使用时 R$styleable

java - 更改时间选择器的主题 - Android

android - AdMob 消耗更多内存

swift - 如何让 Xcode 在混合应用程序的 webview 中查找元素?

javascript - 如何通过单击 react native 按钮将数据发送到 webview

android - WebView 附加到 WindowManager android 时执行缓慢

javascript - 在 Android 4.4 上获取 Chromium WebView?

android - Content Transition NONE 带有空的共享元素

java - 通过 Google 脚本从 Android 设备发送到 Google 表格。这安全吗?

android - 如何在加载 WebView 页面时为警告对话框设置不同的标题?