Intereting Posts

Метод WebView + WebChromeClient onCreateWindow не вызывается для target = "_ blank"

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

В соответствии с API Doc я переопределил onCreateWindow WebChromeClient , но не вызывается, когда такая ссылка используется. Может быть ошибка этого уровня 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"); } } 

Solutions Collecting From Web of "Метод WebView + WebChromeClient onCreateWindow не вызывается для target = "_ blank""

Убедитесь, что для параметра 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; } }); 

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

 webView.getSettings().setSupportMultipleWindows(true); 

Затем будет onCreateWindow .

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

Этот код javascript получает все теги ссылок на загруженной странице и анализирует, есть ли атрибут с target = "_ blank". Для каждой из этих ссылок будет добавлено «newtab:» перед значением url атрибута href. Затем в методе 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; } }