WebView + WebChromeClient方法onCreateWindow没有调用target ="_ blank"

Lot*_*tzy 11 android webview webchromeclient

我试图建立一个custom browserWebView采用Android API level 10(SDK 2.3.3),不幸的是我不知道如何从拦截请求webpage以打开新的浏览器窗口的URL,像与链接水龙头target="_blank".

在与符合API Doc我已经覆盖了onCreateWindowWebChromeClient,但是当这样的链接被点击不叫.可能是这个API级别的错误?我还要shouldOverrideUrlLoading完全避免WebView在内置浏览器中打开后续链接.

这是我打开的示例代码google.com.要测试它,请点按"新闻",然后点按任何新闻标题.Android内置浏览器通常以新的方式打开它browser window.

package com.myexample;

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

public class HelloAndroidActivity extends Activity {

  private static String TAG = "WebViewTest";
  private WebView mWebView;

  @Override
  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() {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
      }
    });

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

}
Run Code Online (Sandbox Code Playgroud)

Gee*_*ing 25

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

WebSettings settings = webView.getSettings();
settings.setSupportMultipleWindows(true);
Run Code Online (Sandbox Code Playgroud)

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

  • 对我来说它不起作用,来自 onCreateWindow() 方法的 Toast 没有显示。我还在该行中放置了一个断点,并使用调试器启动了应用程序,但执行不会在那一行中停止。 (2认同)

Lot*_*tzy 7

除了注入javascript代码之外找不到任何解决方案.我甚至尝试编译从google源代码库下载的内置android浏览器代码,但不会编译,因为我发现它使用了一些非公共API.Dolphin浏览器也使用自己的扩展WebView,所以我没有找到他们如何实现打开新窗口请求检测.

此javascript代码获取加载页面上的所有链接标记,并分析是否存在target ="_ blank"的属性.对于这些链接中的每一个,都会在href属性的url值前面添加"newtab:".然后在shouldOverrideUrlLoading()方法中,我检查url是否以"newtab:"字符串开头,在这种情况下,我打开一个新选项卡.

以下是代码snipets:

mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript: var allLinks = document.getElementsByTagName('a'); if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target'); if (target && target == '_blank') {link.setAttribute('target','_self');link.href = 'newtab:'+link.href;}}}");
    }



    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String urls) {
        if (urls.startsWith("newtab:")) {
            addTab(); //add a new tab or window
            loadNewURL(urls.substring(7)); //strip "newtab:" and load url in the webview of the newly created tab or window
        }
        else {
            view.loadUrl(urls); //load url in current WebView
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript: var allLinks = document.getElementsByTagName('a'); if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target'); if (target && target == '_blank') {link.setAttribute('target','_self');link.href = 'newtab:'+link.href;}}}");
    }



    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String urls) {
        if (urls.startsWith("newtab:")) {
            addTab(); //add a new tab or window
            loadNewURL(urls.substring(7)); //strip "newtab:" and load url in the webview of the newly created tab or window
        }
        else {
            view.loadUrl(urls); //load url in current WebView
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

你需要看看这个:

webView.getSettings().setSupportMultipleWindows(true);
Run Code Online (Sandbox Code Playgroud)

然后onCreateWindow会被召唤.