2017-09-03 5 views
-2

Cette fonction est d'obtenir à long url de url courte, comme goo.gl, bit.ly ...Android - Comment étendre Url Raccourcissement à l'aide WebView

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

Je veux stocker webView.getUrl() à une chaîne appeler finalURL pour que je puisse l'utiliser plus tard, mais il se erreur

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

ce qui est mon erreur?

+0

j'avais modifié le message tout à l'heure, s'il vous plaît jeter un oeil, merci. – StackSN

Répondre

0

Si la variable finalURL est la variable membre de la classe externe, alors il est possible pour vous d'enregistrer le webView.getUrl() à finalURL à des fins ultérieures comme l'analyse syntaxique, mais si finalURL est une variable locale , alors ce n'est pas possible à moins de le faire en tant qu'objet tableau et variable finale. Utilisez le code ci-dessous. Au lieu d'utiliser plaine finalURL, utilisez finalURL [0] pour stocker et analyser ultérieurement.

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

Ici, dans l'exemple ci-dessous, vous pouvez voir la valeur de localvar variable locale étant modifiée par la méthode (anonyMethod) à l'intérieur de l'objet anonyme de « » à un

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 Pouvez-vous publiez aussi un peu plus votre code.

Modifier 2 Ajouté mon propre exemple de code.

+0

toute suggestion comment le rendre capable de passer entre la classe de différence? – StackSN

+0

J'ai mis à jour la réponse ci-dessus. Faites-moi savoir si le code ci-dessus fonctionne. – Sam

+0

pas d'erreur mais la variable 'finalURL [0]' n'a pas de valeur. – StackSN

0

Vous utilisez un champ déjà défini dans la classe anonyme, si vous devez modifier ce champ puis en faire une variable de niveau classe. Déclarez-le en dehors de toutes vos méthodes. essayer

public String finalURL = ""; 
+0

Je reçois aussi une erreur, 'erreur: impossible d'affecter une valeur à la variable finale finalURL' – StackSN

0

Vous pouvez essayer un

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; 

     } 
    }