2014-09-25 10 views
8

Sono di fronte a uno strano problema.Android WebView che ignora target = "_ blank" quando si aggiunge WebViewClient

Nella mia applicazione, ho bisogno di caricare un file html statico basato sul pulsante cliccato in una WebView dalla cartella delle risorse.

Ora tra 5 file html, un file html contiene 15 collegamenti statici. Questi collegamenti devono reindirizzare l'utente all'url indicato in un browser mobile. Ho usato target="_blank" per quello scopo come segue nel mio file html.

<div class="lid"><a href="https://www.irctc.co.in/" target="_blank">Railway Reservation </a></div> 

Ora, questo funziona bene in un'applicazione di esempio con una semplice WebView senza WebViewClient aggiunto ad esso.

Ma ho bisogno di un WebViewClient per le altre funzionalità. Quindi in quel momento target="_blank" è completamente ignorato. E l'url viene aperto in una WebView stessa.

ho trovato una soluzione, che posso usare shouldOverrideUrlLoading come segue:

myWebView.setWebViewClient(new WebViewClient(){ 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    // TODO Auto-generated method stub 

     if(url.equalsIgnoreCase("https://www.irctc.co.in/")) 
     { 
      view.getContext().startActivity(
          new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
      return true; 
     } 
     else 
      return super.shouldOverrideUrlLoading(view, url); 
    } 
}); 

Quindi questo sta aprendo quel particolare URL in un browser di default.

Quindi, in pratica le mie domande sono:

Perché target="_blank" ignorato mentre usiamo WebViewClient? E c'è qualche altra soluzione per questo problema? Perché ho 15 collegamenti, che avrei bisogno di confrontare. Non riesco a caricare tutti gli URL in un nuovo browser, poiché ci sono alcuni collegamenti, che devono essere aperti anche in una stessa WebView.

risposta

4

Ho un'idea per una soluzione alternativa. Sostituisci tutti i collegamenti che dovrebbero essere aperti in una nuova finestra con uno schema personalizzato. Quindi puoi gestirlo da solo.

Per una minima interruzione impostare anche un tema personalizzato e gestire tutte le modifiche di configurazione:

<activity android:name="com.example.LinkHandler" 
      android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
      android:theme="@android:style/Theme.Translucent"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 

     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.BROWSABLE"/> 

     <data android:scheme="your.link.handler.schema"/> 
    </intent-filter> 
</activity> 

Poi, nel tuo gestore di collegamento si può leggere l'URL utilizzando getIntent().getData().

Si prega inoltre di tenere presente che è necessario gestire http e https, l'ho saltato nel mio breve esempio sopra.

Ecco un esempio JavaScript come riscrivere gli URL:

for(var i=0; i<document.links.length; i++) { 
 
    if(document.links[i].target == "_blank") { 
 
     document.links[i].href = "your.schema.for."+document.links[i].href; 
 
    } 
 
}
<ul> 
 
    <li><a href="http://example.com">Test 1</a></li> 
 
    <li><a href="http://example.net" target="_blank">Test 2</a></li> 
 
    <li><a href="https://example.com" target="_blank">Test 3</a></li> 
 
    <li><a href="https://example.net">Test 4</a></li> 
 
</ul>

+0

Come sostituire Collegamenti con schema personalizzato? Non ho una chiara idea di ciò. –

+0

Es. con javascript puoi inserire un piccolo JavaScript nella tua webview per riscrivere i link. Basta scorrere tutti i link e inserire il tuo schema. – rekire

+0

@MysticMagic controlla la mia modifica. – rekire

Problemi correlati