web-dev-qa-db-ja.com

WebView + WebChromeClientメソッドonCreateWindowがtarget = "_blank"に対して呼び出されません

Android custom browser(sdk 2.3.3)を使用してWebViewAPI level 10を開発しようとしていますが、残念ながらその方法がわかりませんwebpageからのリクエストを傍受して、target="_blank"のリンクをタップするなど、新しいブラウザウィンドウでURLを開きます。

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

}
 </ code>
11
Lotzy

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;
        }
    });
25
Geert Weening

Javascriptコードを挿入する以外の解決策が見つかりませんでした。組み込みのAndroid googleソースリポジトリからダウンロードしたブラウザコードをコンパイルしようとしましたが、非公開APIを使用していることがわかったため、コンパイルできません。Dolphinブラウザも独自の拡張WebViewを使用しているためです。彼らが新しいウィンドウを開くリクエストの検出をどのように実装しているかを知ることができませんでした。

このJavaScriptコードは、ロードされたページのすべてのリンクタグを取得し、target = "_blank"の属性があるかどうかを分析します。これらのリンクごとに、href属性のurl値の前に「newtab:」が追加されます。次に、shouldOverrideUrlLoading()メソッドで、URLが「newtab:」文字列で始まるかどうかを確認します。この場合、新しいタブを開きます。

コードスニペットは次のとおりです。

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;
    }
}
</ code>
7
Lotzy

あなたはこれを見る必要があります:

webView.getSettings().setSupportMultipleWindows(true);

次に、onCreateWindowが呼び出されます。

6
Jon B