Метод WebView + WebChromeClient onCreateWindow не вызывается для target = "_ blank" - PullRequest
11 голосов
/ 20 декабря 2011

Я пытаюсь разработать custom browser с WebView с помощью Android API level 10 (SDK 2.3.3), к сожалению, я не знаю, как перехватить запрос от webpage, чтобы открыть URL в новом браузере окно, как нажатие на ссылки с target="_blank".

В соответствии с API Doc я переопределил onCreateWindow из WebChromeClient, но не вызывается при нажатии такой ссылки. Может ли быть ошибка этого уровня API? Я также переопределяю shouldOverrideUrlLoading, чтобы WebView не открывал последующие ссылки во встроенном браузере.

Вот мой пример кода, который открывается google.com. Чтобы проверить это, нажмите «Новости», а затем нажмите на любой заголовок новости. Встроенный браузер Android обычно открывает его в новом browser window.

</p> <pre><code>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"); } }

Ответы [ 3 ]

25 голосов
/ 01 июля 2012

Убедитесь, что для supportMultipeWindows установлено значение true.Без этого onCreateWindow WebChromeClient никогда не будет вызываться.

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;
        }
    });
7 голосов
/ 25 января 2012

Не удалось найти никакого решения, кроме введения кода JavaScript. Я даже пытался скомпилировать встроенный код браузера Android, загруженный из исходного репозитория google, но не скомпилировал, поскольку обнаружил, что используется какой-то непубличный API. Браузер Dolphin также использует собственный расширенный WebView, поэтому мне не повезло узнать, как они реализуют обнаружение запроса открытия нового окна.

Этот код JavaScript получает все теги ссылок на загруженной странице и анализирует наличие атрибута с target = "_ blank". Для каждой из этих ссылок будет добавлено «newtab:» перед значением url атрибута href. Затем в методе shouldOverrideUrlLoading () я проверяю, начинается ли URL со строки «newtab:», и в этом случае я открываю новую вкладку.

Вот фрагменты кода:

mWebView.setWebViewClient(new WebViewClient() {</p> <pre><code> @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; } }

6 голосов
/ 01 февраля 2012

Вам нужно взглянуть на это:

webView.getSettings().setSupportMultipleWindows(true);

Тогда будет вызван onCreateWindow.

...