android - 未为目标 ="_blank"调用 WebView + WebChromeClient 方法 onCreateWindow

标签 android webview webchromeclient

我正在尝试使用 Android API 级别 10 (sdk 2.3.3) 开发带有 WebView自定义浏览器,不幸的是我没有不知道如何拦截来自 webpage 的请求以在新的浏览器窗口中打开 URL,例如点击带有 target="_blank" 的链接。

根据 API 文档,我已经覆盖了 WebChromeClientonCreateWindow,但在点击此类链接时不会调用。可能是这个 API 级别的错误?我还覆盖了 shouldOverrideUrlLoading 以避免 WebView 在内置浏览器中打开后续链接。

这是我打开 google.com 的示例代码。要对其进行测试,请点击“新闻”,然后点击任何新闻标题。 Android 内置浏览器通常会在新的浏览器窗口中打开它。

包 com.myexample;

导入 android.app.Activity;
导入 android.os.Bundle;
导入 android.os.Message;
导入 android.util.Log;
导入 android.webkit.WebChromeClient;
导入 android.webkit.WebView;
导入 android.webkit.WebViewClient;
导入 android.widget.Toast;

公共(public)类 HelloAndroidActivity 扩展 Activity  {

  私有(private)静态字符串 TAG = "WebViewTest";
  私有(private) WebView mWebView;

  @覆盖
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate");
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.mywebview);

    mWebView.setWebViewClient(new WebViewClient() {
      @覆盖
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        返回真;
      }
    });

    mWebView.setWebChromeClient(new WebChromeClient() {
      @覆盖
      public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) {
        Toast.makeText(getApplicationContext(), "OnCreateWindow", Toast.LENGTH_LONG).show();
        返回真;
      }
    });
    mWebView.loadUrl("http://www.google.com");
  }

}

最佳答案

确保将 supportMultipeWindows 设置为 true。没有它,WebChromeClient 的 onCreateWindow 将永远不会被调用。

WebSettings settings = webView.getSettings();
settings.setSupportMultipleWindows(true);

然后注册一个WebChromeClient并覆盖onCreateWindow

 webView.setWebChromeClient(new WebChromeClient() {
        @Override public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg)
        {
            WebView newWebView = new WebView(getContext());
            addView(newWebView);
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(newWebView);
            resultMsg.sendToTarget();
            return true;
        }
    });

关于android - 未为目标 ="_blank"调用 WebView + WebChromeClient 方法 onCreateWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8578332/

相关文章:

Android Instant 应用程序无法通过应用程序链接在我的 Beta 预发布测试中运行

Android 验证 SSL 证书

javascript - SVG 路径元素不会在 JavaFX8 Web View 中触发鼠标事件

java - 如何实现WebView滚动时隐藏工具栏?

android - 如何检测 WebView 页面何时试图关闭?

java - 在 Android 上更改 DateFormat 中的时间

android - 我如何在 react 原生 webview 中从网页访问当前位置

android - 如何连接webviewclient和Chromeweb View 客户端

java - Android 请求在 webview 中使用位置的权限

android - 连接两个表并替换值