2015-03-10 3 views
0

Я использую андроид для просмотра URL-адреса. он работает нормально, но проблема заключается в том, что некоторые из ссылок (target = _blank) внутри веб-страницы не открываются по умолчанию. Я отлаживаю проект и обнаружил, что эти ссылки не вызывают метод overoverrideurlloading() в webviewclient().Android Web View - shouldoverrideurlloading not called

это webviewclient,

public class MyWebClient extends WebViewClient { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 

    } 
} 

ответ

0

Этот метод не имеет смысла. Он просто загрузит URL-адрес и всегда вернет TRUE логическое значение.

Попробуйте один

webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setDomStorageEnabled(true); 
webView.loadUrl("url"); 
+0

Этот метод отлично работает в других URL-адресах на веб-странице. проблемы - это некоторые внешние ссылки, которые не вызываются. – user3800832

1

Это происходит потому, что такие ссылки вызывают открытие всплывающих окон (новые вкладки, если вы находитесь в браузере). По умолчанию вскрытие всплывающих окон отключено в WebView. Выезд http://developer.android.com/reference/android/webkit/WebSettings.html#setSupportMultipleWindows(boolean)

Вы должны установить WebChromeClient для своего основного WebView, а затем предоставить пустой новый WebView, который будет служить для открытия содержимого всплывающего окна.

Это суть того, что вам нужно сделать:

webView.getSettings().setSupportMultipleWindows(true); 

webView.setWebChromeClient(new WebChromeClient { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean isDialog, 
      boolean isUserGesture, Message resultMsg) { 
     // Create a WebView 
     WebView popupWebView = new WebView(view.getContext()); 
     // TODO: Put WebView into your view hierarchy, if needed. 
     // 
     // This is needed to open the url in the WebView. 
     // Without the client, WebView will try to start a browser. 
     popupWebView.setWebViewClient(new WebViewClient()); 
     WebView.WebViewTransport transport = 
      (WebView.WebViewTransport) resultMsg.obj; 
     transport.setWebView(popupWebView); 
     resultMsg.sendToTarget(); 
     return true; 
    } 
}); 

Этот ответ содержит дополнительный код, который необходим, если вы хотите, чтобы справиться с закрытием всплывающих окон: How to handle facebook like with confirm in android webview

BTW, это не нужно переопределить shouldOverrideUrlLoading, если вы просто хотите, чтобы открывать ссылки внутри WebView, просто установив WebViewClient достаточно:

webView.setWebViewClient(new WebViewClient()); 
+0

, то он открыт в браузере или на веб-сайте? – user3800832

+0

@ user3800832: Это зависит от того, установлен ли WebViewClient для 'popupWebView' и что вы делаете в' shouldOverrideUrlLoading' (то же самое, что и для обычного WebView). Я добавил еще несколько строк в свой примерный код, чтобы проиллюстрировать это. –

+0

таким образом внешние ссылки открываются в браузере, но я хочу открыть эти вещи внутри веб-представления. – user3800832

0

Я обнаружил, что если вы работаете в iframe, shouldOverrideUrlLoading() не запускается для внешних ссылок, если вы не добавите target="_top" (я не пробовал target="_blank").

Следующий код JavaScript добавляет этот целевой атрибут к каждой ссылке.

function change_links_target() 
{ 
    var all_document_links = mFrameDocument.getElementsByTagName("a"); 
    for (i = 0; i < all_document_links.length; i++){ 
     all_document_links[i].setAttribute("target", "_top"); 
    } 
}