2014-04-25 6 views
14

Es gibt zwei Arten von Links in der HTML-Datei:WebView shouldOverrideUrlLoading() nicht für ungültige Links genannt

(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 vor dem Laden der URL mit einer festen Adresse wie http://www.abc.com voranstellen.

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

Ich denke, was passiert ist, wird WebView 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:

versuchte ich

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

zu

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

Dann ist die Funktion aufgerufen wird, zu ändern.

Wenn ich die kurze Verbindung zu einem vollständigen Link in der HTML-Zeichenfolge manuell ändern. Dann wird die Funktion auch aufgerufen.

Also ich denke, das ist wahrscheinlich was passiert: Das WebView überprüft, ob die Link-URL gültig ist. Nur wenn die URL gültig ist, wird die shouldOverrideUrlLoading() aufgerufen.

+0

Können Sie uns etwas Code Ihrer Implementierung von shouldOverrideUrlLoading() zeigen? – shkschneider

+0

@shkschneider Code hinzugefügt. Aber das Problem ist, dass die Funktion nicht aufgerufen wird, wenn die URL nicht gültig ist. – darklord

+0

Hinweis nach dem Bearbeiten: Ja, genau das passiert. Versuchen Sie, eine BaseUrl – shkschneider

Antwort

12

Sie versuchen, mit sind wahrscheinlich die KitKat WebView verwenden. Dies ist ein bekanntes Problem (ich denke, es wird im Migrationsleitfaden beschrieben), bei dem URLs, die nicht mit der Basis-URL aufgelöst werden können, auf dem Boden gelöscht werden (Sie erhalten keine Callbacks, weder shouldOverrideUrlLoading noch onPageStarted).

Das Problem ist, dass Ihre Basis-URL eine Daten-URL ist, also versuchen Sie '/ q? Type = short' gegen 'data: text/html, ...' aufzulösen, was wenig Sinn macht und so wird der ganze Versuch, zu der URL zu navigieren, ignoriert.

Dies war anders für die Pre-KK WebView, die KURL anstelle von GURL für URL-Verarbeitung verwendet. GURL ist im Allgemeinen strenger (und sicherer) als KURL, was die Ursache für einige Inkompatibilitäten zwischen den beiden WebView-Versionen ist.

+1

Migrationsanleitung: https://developer.android.com/guide/webapps/migrating.html – Beth

5

Lösung, die für mich gearbeitet wurde loadDataWithBaseURL mit einem ungültigen baseUrl zu verwenden, und das erkennt und entfernen und ersetzen mit „http: //“ während 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

Versuchen Sie, diese

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

ich auch dieses Problem konfrontiert und löste es durch meine HTML-Antwort zu ersetzen. In meiner HTML Antwort gibt es keinen Host in "href" HTML Tags. Dann habe ich es folgenden Codes ersetzt und das funktioniert jetzt wie ein Charme :)

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