2013-08-12 11 views
14

I build un WebView che visualizza un sito Web. Il sito Web contiene collegamenti senza attributo target="_blank" e alcuni con esso.Android: apre i collegamenti _blank di destinazione in WebView con il browser esterno

Ho bisogno di aprire i collegamenti con target definiti nel browser di periferica standard esterno e quelli senza esso all'interno di WebView.

sto usando un WebViewClient e ho cercato in giro con questa funzione, ma ancora tutti i miei collegamenti sono aperti entro il WebView:

Alternativa 1:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

    return super.shouldOverrideUrlLoading(view, url);   
} 

Alternativa 2:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

    view.loadUrl(url); 
    return true;   
} 

Qualcuno sa come posso aprire i link vuoti esternamente?

Grazie!

PS: Per evitare incomprensioni: non è possibile utilizzare this approach perché l'unico modo in cui so che il collegamento deve essere aperto esternamente è l'attributo target.

risposta

30

Dopo aver visitato i collegamenti precedenti, ho trovato questo codice e spero che questo aiuti.

wv.getSettings().setSupportMultipleWindows(true); 
wv.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg) 
    { 
     WebView.HitTestResult result = view.getHitTestResult(); 
     String data = result.getExtra(); 
     Context context = view.getContext(); 
     Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data)); 
     context.startActivity(browserIntent); 
     return false; 
    } 
}); 
+2

È importante capire quando fa trigger suCreateWindow. Si prega di consultare il [collegamento] (http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html) per capire meglio –

+0

C'è un modo per farlo con il normale webviewclient? –

+0

a volte 'data' è nullo –

0

Ho anche lo stesso problema e ora ho trovato la soluzione.

È inoltre necessario utilizzare WebChromeClient. È possibile vedere this e this. Ed è possibile impostare un WebViewClient sulla nuova WebView e sovrascrivere il metodo shouldOverrideUrlLoading, quindi è possibile ottenere l'url e fare ciò che si vuole qui. Se non si imposta WebViewClient, penso che dovrebbe funzionare anche. Nel mio caso voglio ottenere l'URL così ho impostato un WebViewClient per il nuovo WebView.

A proposito, se rimuovi la vecchia webview, quando ritorni dal browser, la webview è vuota. Così ho mantenuto la webview e ne ho aggiunta una nuova, ma ho impostato la visibilità su "gone".

3

Ho affrontato lo stesso problema. Volevo aprire le pagine dei miei siti web all'interno dell'applicazione e riposare tutte le pagine dovrebbero essere aperte nel browser predefinito. Ho usato una tecnica. Se l'URL contiene il nome del mio sito Web, l'ho aperto in WebView e resto tutti i siti aperti nel browser predefinito.

Trova sotto codice, spero che sarebbe utile per tutti coloro che hanno affrontato tali problemi.

private class MyBrowser extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.contains("/internetgeeks")) { 
      browser.loadUrl(url); 
      return false; 
     } else { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 
    } 
} 
+0

La risposta di Carson-ip è migliore: gestisce nativamente' target = "_ blank" 'come richiesto. – Guillaume

+0

Solo per completare la risposta, startActivity non era disponibile per me, ho chiamato 'intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);' e richiamo l'attività da 'view.Context.ApplicationContext.StartActivity (intent);' – Daniel

Problemi correlati