2017-09-03 5 views
-2

Diese Funktion ist lange URL von Kurz-URL wie goo.gl zu bekommen, bit.ly ...Android - Wie verkürzte URL erweitern WebView mit

private String expandUrl(String shortUrl) { 
    String finalURL = ""; 
    webView.loadUrl(shortUrl); 
    webView.setWebViewClient(new WebViewClient() { 
     public void onPageFinished(WebView view, String url) { 
      finalURL = webView.getUrl(); 
     } 
    }); 
    return finalURL; 
} 

I webView.getUrl() in einen String speichern wollen rufen finalURL so, dass ich es später verwenden können, aber es Fehler bekommen

error: local variable finalURL is accessed from within inner class; needs to be declared final

was ist mein Fehler?

+0

ich gerade jetzt die Post bearbeitet hatte, nehmen Sie bitte einen Blick, Dank. – StackSN

Antwort

0

Wenn finalURL Variable die Membervariable der äußeren Klasse ist, dann ist es Ihnen möglich, die webView.getUrl() zu finalURL für spätere Zwecke wie Parsen zu retten, aber wenn finalURL ist eine lokale Variable , dann ist es nicht möglich, es sei denn, Sie machen es als Array-Objekt und als letzte Variable. Verwenden Sie den folgenden Code. Verwenden Sie finalURL [0] anstelle von plain finalURL, um sie später zu speichern und zu analysieren.

final String[] finalURL = {""}; 
String url1 = "goo.gl/RvoAZH"; 
webView.loadUrl(url1); 
webView.setWebViewClient(new WebViewClient() { 
public void onPageFinished(WebView view, String url) { 
System.out.println(webView.getUrl()); // whatever way to debug 
finalURL[0] = webView.getUrl(); 
} 
}); 

Hier im Beispiel unten Sie den Wert der lokalen Variablen localvar durch das Verfahren (anonyMethod) innerhalb des anonymen Objekt von „“ zu einem

public class Check { 
    public void method() { 
     final String[] localVar = {""}; 
     new Object() { 
      public void anonyMethod() { 
       System.out.println(localVar[0]); // sure 
       localVar[0] = "a"; // nope 
      } 
     }.anonyMethod(); 
     System.out.println(localVar[0]); 
    } 

    public static void main(String[] args) 
    { 
     Check ck = new Check(); 
     ck.method(); 
    } 
} 

Edit 1 Sie geändert werden sehen konnte Can poste auch mehr deinen Code.

Bearbeiten 2 Eigenen Beispielcode hinzugefügt.

+0

Irgendwelche Vorschläge, wie man es zwischen Differenzklassen passieren lassen kann? – StackSN

+0

Ich habe die Antwort oben aktualisiert. Lassen Sie mich wissen, ob der obige Code funktioniert. – Sam

+0

kein Fehler, aber die Variable 'finalURL [0]' hat keinen Wert. – StackSN

0

Sie verwenden ein bereits definiertes Feld in der anonymen Klasse, wenn Sie dieses Feld ändern und es dann zu einer Variablen auf Klassenebene machen müssen. Deklariere es außerhalb all deiner Methoden. versuchen, diese

public String finalURL = ""; 
+0

Ich bekomme auch einen Fehler, 'error: kann der finalen Variable finalURL keinen Wert zuweisen – StackSN

0

können Sie versuchen, dieses

private class MyWebViewClient extends WebViewClient { 
     @SuppressWarnings("deprecation") 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      final Uri uri = Uri.parse(Uri.decode(url)); 
      return handleUri(uri); 
     } 

     @TargetApi(Build.VERSION_CODES.N) 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      final Uri uri = request.getUrl(); 
      return handleUri(uri); 
     } 

     private boolean handleUri(final Uri uri) { 
      return false; 
     } 

     @Override 
     public void onLoadResource(WebView view, String url) { 
      if (url.equals("http://yoururl.com")) { 
       // do something 
      } 
     } 

     @Override 
     public void onFormResubmission(WebView view, Message dontResend, Message resend) { 
      resend.sendToTarget(); 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      mCacheWebView.setVisibility(View.INVISIBLE); 
      showSwipeRefresh(); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      if (webViewError) { 
       setErrorWebView(); 
      } else { 
       if (mCacheWebView != null) { 
        mCacheWebView.loadUrl("javascript:(function() { " + 
          "var head = document.getElementsByTagName('header')[0];" 
          + "head.parentNode.removeChild(head);" + 
          "})()"); 
        mCacheWebView.setVisibility(View.VISIBLE); 
       } 
      } 
      hideSwipeRefresh(); 
     } 

     @Override 
     public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { 
      super.onReceivedHttpError(view, request, errorResponse); 
     } 

     @Override 
     public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
      String message = "SSL Certificate error."; 
      switch (error.getPrimaryError()) { 
       case SslError.SSL_UNTRUSTED: 
        message = "The certificate authority is not trusted."; 
        break; 
       case SslError.SSL_EXPIRED: 
        message = "The certificate has expired."; 
        break; 
       case SslError.SSL_IDMISMATCH: 
        message = "The certificate Hostname mismatch."; 
        break; 
       case SslError.SSL_NOTYETVALID: 
        message = "The certificate is not yet valid."; 
        break; 
      } 
      message += " Do you want to continue anyway?"; 
      Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); 
     } 

     @RequiresApi(api = Build.VERSION_CODES.M) 
     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      onReceivedError(view, error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); 
//   view.loadUrl("file:///android_asset/no_internet.html"); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      webViewError = true; 

     } 
    } 
Verwandte Themen