14

Android (sdk 2.3.3)custom browserを使用して を開発しようとしていますが、残念ながら からのリクエストをインターセプトして新しいブラウザ ウィンドウで URL を開く方法がわかりません。WebViewAPI level 10webpagetarget="_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");
  }

}

4

4 に答える 4

28

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;
        }
    });
于 2012-07-01T09:10:03.787 に答える
8

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

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

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

    mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            // Find all <a> with target="_blank" and append "newtab:" at the beginning. 
            // Make sure a null is at the end to avoid displaying a blank page
            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;}}} null");
        }



        @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;
        }
    }

于 2012-01-25T12:02:38.510 に答える
6

これを見てみる必要があります:

webView.getSettings().setSupportMultipleWindows(true);

その後onCreateWindow、呼び出されます。

于 2012-02-01T07:19:56.753 に答える