WebView shouldOverrideUrlLoading () nicht für ungültige Links aufgerufen

Es gibt zwei Arten von Links in der HTML-Datei:

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

Für die erste Art, laden Sie einfach die URL. Für die zweite Art, sollte ich es mit einer festen Adresse wie http://www.abc.com vor dem Laden der URL voranstellen.

Ich versuche dies zu tun, wenn ich die Funktion shouldOverrideUrlLoading () in WebViewClient überschreibe. Diese Funktion wird jedoch nicht für den zweiten Link verwendet. Ich habe versucht, die " http://www.abc.com " auf die zweite Art von Links in der HTML-Datei vorzugeben. Dann wird die Funktion aufgerufen, wenn ich auf die zweite Art von Link klicke.

Ich denke, was passiert ist WebView wird zuerst überprüfen, ob der Link eine gültige URL ist. Nur wenn es gültig ist, wird die Funktion aufgerufen. Habe ich recht? Wie kann ich das lösen? Danke im Voraus.

  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); 

Mehr dazu:

Ich habe versucht zu ändern

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

nach

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

Dann wird die Funktion aufgerufen.

Wenn ich den kurzen Link zu einem vollständigen Link in der HTML-Zeichenfolge manuell ändere. Dann wird die Funktion auch aufgerufen.

Also ich denke, das ist wohl was passiert: Die WebView prüft, ob die Link-URL gültig ist. Erst wenn die URL gültig ist, wird die ifOverrideUrlLoading () aufgerufen.

  • Wie füge ich "Go Back" -Funktion in WebView in Fragment hinzu?
  • Einbetten einer Webansicht in eine andere Ansicht
  • Android: webview inside dialog oder popup
  • Saving Webpage im Cache mit Webview in Android
  • Wie man Facebook Fan-Seite zu öffnen und zu überprüfen, ob Benutzer es mochte
  • WebView macht keine lokale HTML-Seite auf App-Start in Android 4.0.x Ice Cream Sandwich
  • Ist "shouldOverrideUrlLoading" wirklich veraltet? Was kann ich stattdessen verwenden?
  • Android - Wie man Bilder von Ressourcen zieht?
  • 6 Solutions collect form web for “WebView shouldOverrideUrlLoading () nicht für ungültige Links aufgerufen”

    Sie verwenden wahrscheinlich das KitKat WebView. Dies ist ein bekanntes Problem (ich glaube, es ist in der Migrationsanleitung skizziert), wo URLs, die nicht gegen die Basis-URL aufgelöst werden können, auf den Boden fallen gelassen werden (man bekommt keine Rückrufe für sie, weder sollteOverrideUrlLoading noch onPageStarted).

    Das Problem ist, dass deine Basis-URL eine Daten-URL ist, also versuchst du zu lösen '/ q? Type = short' gegen 'data: text / html, …' was nicht viel Sinn macht und so das ganze Der Versuch, zur URL zu navigieren, wird ignoriert.

    Dies war für die Pre-KK WebView unterschiedlich, die KURL anstelle von GURL für die URL-Verarbeitung verwendet hat. GURL ist in der Regel strenger (und sicherer) als KURL, was die Ursache für einige Inkompatibilität zwischen den beiden WebView Versionen ist.

    Lösung, die für mich arbeitete, war, loadDataWithBaseURL mit einer ungültigen baseUrl zu verwenden und zu erkennen und zu entfernen und durch "http: //" während setWebViewClient zu ersetzen

     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) { } } } 

    Vielleicht versuchen Sie mit onPageStarted Methode

    Ich stellte dieses Problem auch und löste es, indem ich meine HTML-Antwort ersetzte. In meiner HTML-Antwort gibt es keinen Host in "href" html-Tags. Dann habe ich es nach Codes ersetzt und das funktioniert wie ein Charme jetzt 🙂

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

    Ich habe festgestellt, dass, wenn Ihre Seite läuft in einem iframe, klicken Sie auf externe ( http: // www … ) Links nicht auslösen shouldOverrideUrlLoading ()! Siehe shouldOverrideUrlLoading () nicht für externe Links von iframe aufgerufen

    Versuche dies

      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; } 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.