2010-09-13 6 views
10

Pour une raison quelconque le onPageFinished tire avant la fin du chargement WebView - Je ne peux pas comprendre pourquoi ...onPageFinished pas tirer correctement lors du rendu page Web

public class WebViewClientTest extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final WebView webview = (WebView) findViewById(R.id.webview); 

    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(webview, url); 
      webview.scrollTo(0, 500); 
     } 
    }); 
    webview.loadUrl("http://www.google.co.uk/search?sourceid=chrome&ie=UTF-8&q=lala"); 

} 
} 

OK, il semble bien comme ceci n'est pas fixé. Je pense qu'il y a une condition de course en cours lors du chargement de la page, mais ne peut pas obtenir un comportement reproductible.

Je stocke le contenu HTML d'une page Web dans une base de données SQLite pour l'afficher hors connexion. Je recharger le contenu dans le WebView avec:

webView.loadDataWithBaseURL("fake://fake.com/", htmlBody, "text/html", "utf-8", null); 

Il semble que, parfois, lorsque la charge WebView il se déclenche correctement la méthode WebViewClient.onPageFinished(), et d'autres fois non. Parfois, il semble se déclencher avant la fin du chargement de la page, produisant un contentHeight de 0 et ignorant les appels scrollTo.

Quelqu'un a-t-il de l'expérience?

Répondre

12

J'avais un projet qui avait du code qui devait fonctionner seulement après que le webview ait affiché son contenu, et comme vous, onPageFinished() ne fonctionnait pas. Il a tiré trop rapidement, avant que le webview ait réellement rendu la page. Au lieu de cela, j'ai dû utiliser un "PictureListener" qui se déclenche quand le webview met à jour l'écran.

Vous pouvez l'utiliser comme ceci:

mWebView.setPictureListener(new MyPictureListener()); 
//... and then later on.... 
class MyPictureListener implements PictureListener { 

    @Override 
    public void onNewPicture(WebView view, Picture arg1) { 
     // put code here that needs to run when the page has finished loading and 
     // a new "picture" is on the webview.  
    }  
} 
+0

Parfait - merci! Je veux juste ajouter que cette onNewPicture se déclenche même après qu'un événement de défilement soit terminé, donc j'ai dû coder autour de cela, mais ce qui précède fonctionne parfaitement. – DaBeeeenster

+3

sauf que cela est maintenant obsolète (assistant de la tablette - ciel) :( Donc j'utilise un appel javascript qui dépasse WebChromeClient onProgressChanged() en termes de temps de retour ... Il suffit de faire attention au Thread que vous utilisez quand vous obtenez le retour (j'utilise le WebView's Handler avec un appel différé) - tout cela étant dit, je vais voir comment WebChromeClient.onProgressChanged() effectue – Dan

+0

est-il un meilleur moyen de le faire? –

1

Hmm, eh bien si je fais ma propre classe privée, cela fonctionne ...

private class ViewStoryWebViewClient extends WebViewClient { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(webView, url); 
     webView.scrollTo(0, 50); 
    } 
} 
+1

cela arrive trop tôt, avant que l'image soit rendue –

0

Je reçois exactement la même chose avec loadDataWithBaseURL(). Parfois, le contenu n'apparaît pas et le contenu est vide. La chose étrange est que le fait de cliquer n'importe où dans la vue Web provoque l'affichage du contenu. En outre, si vous appelez zoomIn();zoomOut(); dans la méthode onPageFinished(), la page apparaîtra.

EDIT: Le problème avec mon code est que le contenu HTML avait une fenêtre window.location = assignée dans l'événement onload, ce qui provoquait le chargement du contenu original à des moments aléatoires. Désolé, je ne pense pas que cela soit lié à ce que vous voyez.

4

J'ai eu le même problème de rejeter mon ProgressDialog lors du rendu ma page web. J'ai résolu avec onPageStarted. J'espère que cette solution peut vous aider.

@Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     progressBar.dismiss(); 

    } 

    @Override 
    public void onPageStarted(WebView view, String url, 
      android.graphics.Bitmap favicon) { 

     if (!progressBar.isShowing()) { 
      progressBar.show(); 
     } 
    }; 
+0

Celui-ci fonctionne pour moi. J'ai un webview qui remplace le chargement d'Url. –

Questions connexes