2014-04-25 13 views
14

Ci sono due tipi di collegamenti nel file HTML:WebView shouldOverrideUrlLoading() non chiamato per i collegamenti non validi

(1) A normal link like http://www.bbb.com/q?type=normal 
(2) A short link like /q?type=short. 

Per il primo tipo, basta caricare l'URL. Per il secondo tipo, dovrei anteporlo a un indirizzo fisso come http://www.abc.com prima di caricare l'url.

Sto provando a farlo con l'override della funzione shouldOverrideUrlLoading() in WebViewClient. Tuttavia questa funzione non viene chiamata per il secondo tipo di collegamento. Ho provato ad anteporre "http://www.abc.com" al secondo tipo di link nel file HTML. Quindi la funzione viene chiamata quando faccio clic sul secondo tipo di collegamento.

Penso che quello che sta succedendo sia che prima WebView verificherà se il link è un url valido. Solo se è valido verrà chiamata la funzione. Ho ragione? Come posso risolvere questo? Grazie in anticipo.

 contentWebView = new WebView(context); 

     webViewClient = new WebViewClient() { 
      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 
      } 

      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       // String not in Logger. 
       Log.d(TAG, "Here!"); 
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       context.startActivity(intent); 
       return true; 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(view, url); 
       if (hosted) { 
        contentWebView.setVisibility(VISIBLE); 
       } else { 
        summaryTextView.setVisibility(VISIBLE); 
        articleLinkButton.setVisibility(VISIBLE); 
       } 

       progressBar.setVisibility(View.GONE); 
      } 
     }; 

     contentWebView.setWebViewClient(webViewClient); 
     contentWebView.getSettings().setJavaScriptEnabled(true); 
     contentWebView.loadData(fullString, "text/html", "utf-8"); 
     contentWebView.setVisibility(GONE); 

Maggiori informazioni su questo:

Ho provato a cambiare

contentWebView.loadData(fullString, "text/html", "utf-8"); 

a

contentWebView.loadDataWithBaseURL("http://www.abc.com", fullString, "text/html", "utf-8", null); 

Poi la funzione viene chiamata.

Se cambio il collegamento breve a un collegamento completo nella stringa html manualmente. Quindi viene anche chiamata la funzione.

Quindi penso che questo è probabilmente ciò che sta accadendo: Il WebView controlla se l'URL del link è valido. Solo quando l'URL è valido verrà chiamato shouldOverrideUrlLoading().

+0

Potrebbe mostrarci del codice dell'implementazione shouldOverrideUrlLoading()? – shkschneider

+0

@shkschneider Codice aggiunto. Ma il problema è che la funzione non viene chiamata se l'url non è valido. – darklord

+0

Nota dopo la modifica: sì, è esattamente ciò che accade. Prova a fornire una baseUrl – shkschneider

risposta

12

Probabilmente stai utilizzando il WebView KitKat. Si tratta di un problema noto (penso che sia delineato nella guida alla migrazione) in cui gli URL che non possono essere risolti rispetto all'URL di base vengono rilasciati sul pavimento (non si riceveranno richiami per essi, né dovrebbe OverrideUrlLoading né onPageStarted).

Il problema è che l'URL di base è un URL di dati, quindi stai provando a risolvere '/ q? Type = short' con 'data: text/html, ...' che non ha molto senso e così l'intero tentativo di navigare verso l'URL viene ignorato.

Questo era diverso per il pre-KK WebView che utilizzava KURL anziché GURL per l'elaborazione degli URL. GURL è generalmente più rigoroso (e più sicuro) di KURL, che è la causa di alcune incompatibilità tra le due versioni di WebView.

+1

Guida alla migrazione: https://developer.android.com/guide/webapps/migrating.html – Beth

4

magari provare utilizzando onPageStarted metodo

+1

'onPageStarted' ha funzionato per me – Hadi

5

soluzione che ha funzionato per me è stato quello di utilizzare loadDataWithBaseURL con una baseurl valido e rilevare che e rimuoverlo e sostituirlo con "http: //" durante setWebViewClient

public class MyActivity 
    extends Activity 
{ 
    private static final String badurl = "http://myappname.invalid/"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     ... 
     WebView wv = ((WebView)findViewById(R.id.webview)); 
     WebSettings settings = wv.getSettings(); 
     settings.setJavaScriptEnabled(false); 
     settings.setSupportMultipleWindows(true); 
     wv.setWebChromeClient(new WebChromeClient() { 
      @Override 
      public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) 
      { 
       handleUrlview.getHitTestResult().getExtra()); 
       return true; 
      } 
     }); 
     wv.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) 
      { 
       handleUrl(url); 
       return true; 
      } 
     }); 
     wv.loadDataWithBaseURL(badurl,text,"text/html","utf-8",null); 
    } 

    private void handleUrl(String url) 
    { 
     if (url.startsWith(badurl)) 
      url = "http://"+url.substring(badurl.length()); 
     try { 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
     } catch (ActivityNotFoundException e) { } 
    } 
} 
-1

Prova questa

private static WebView webView; 
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); //should be activity_main 
 

 
     webView = (WebView) findViewById(R.id.web); 
 

 
     webView.setWebViewClient(new webviewclient()); 
 
     webView.getSettings().setJavaScriptEnabled(true); 
 
     webView.loadUrl("http://www.yahoo.com"); 
 

 
    } 
 
public class webviewclient extends WebViewClient{ 
 

 
    @Override 
 
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
 
     view.loadUrl(request.toString()); 
 
     return true; 
 
    }

0

ho affrontato anche questo problema e risolto sostituendo la mia risposta html. Nella mia risposta HTML non c'è nessun host nei tag html "href". Poi l'ho sostituito seguendo i codici e questo funziona come un incantesimo ora :)

 String htmlString = AppCache.homePageResponse.showcaase.replace("href=\"/", "href=\"" + "evidea://"); 
Problemi correlati