2010-11-04 7 views
13

Après le 1er appel à LoadData() l'événement onLoadResource se déclenche comme il se doit et l'affichage est bon. Ensuite, je veux actualiser l'écran avec une nouvelle page, lorsque j'utilise LoadData() la deuxième fois que la page ne se met pas à jour et onLoadResource() ne se déclenche pas. Ensuite, le second appel de LoadData() ne fait qu'attendre OnPageFinished ... onPageStarted ne se déclenche jamais!Android WebView - 1er LoadData() fonctionne bien, les appels suivants ne mettent pas à jour l'affichage

Un travail autour était d'appeler .reload() après LoadData(), mais cela provoque toutes sortes de problèmes au cours de l'autre logique dans l'activité.

Pourquoi LoadData() ne fonctionne-t-il pas plusieurs fois? J'utilise un HTML extrêmement simple, et puisque l'utilisation de .reload() le fait fonctionner, mon instruction LoadData() ne semble pas être le problème.

Toutes les idées seraient utiles, TIA

Répondre

22

Utilisez

webview.loadDataWithBaseURL("same://ur/l/tat/does/not/work", "data", "text/html", "utf-8", null); 

il fonctionne très bien. loaddata ne se régénère pas la prochaine fois que les données sont chargées.

+0

Quelqu'un at-il expliquer pourquoi cela fonctionne? Appeler aussi loadData deux fois fonctionne aussi (sur KitKat de toute façon) mais cette solution semble au moins être moins un hack – Rodney

+0

umm ... Il me manque quelque chose, mais tout ce qui s'est passé était une page blanche avec le mot 'data' sur cela – rikkitikkitumbo

+0

raison pour cela. –

2

Une telle approche fonctionne

webView.loadDataWithBaseURL("fake-url", "<html></html>", "text/html", "UTF-8", null); 
webView.loadData(htmlBuilder.toString(), "text/html", "UTF-8"); 
-1

j'ai pu faire la mise à jour du navigateur sur chaque mise à jour en donnant le document html un autre identifiant chaque fois: S'il vous plaît voir ci-dessous à // WebView.

package com.example.scroll; 
// philip r brenan at gmail.com, www.appaapps.com 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.webkit.WebView; 

public class MainActivity extends Activity 
{protected void onCreate(Bundle savedInstanceState) 
    {super.onCreate(savedInstanceState); 
    setContentView(new MyWebView(this)); 
    } 
    class MyWebView extends WebView 
    {MyWebView(Context Context) 
    {super(Context); 
     getSettings().setJavaScriptEnabled(true); 
     addJavascriptInterface(this, "Android"); 
     new Thread() 
     {public void run() 
     {for(int j = 0; j < 100; ++j) 
      {post(new Runnable() 
      {public void run() 
       {loadData(content(), "text/html", "utf-8"); // Display in browser 
       } 
      });  
      try {Thread.sleep(5000);} catch(Exception e) {} 
      } 
     } 
     }.start(); 
    } 
    int c = 0, C = 1; 
    String content() 
    {final StringBuilder s = new StringBuilder(); 
     //s.append("<html id="+(C++)+"><body>"); // WEBVIEW REFRESHES CORRECTLY *************** 
     s.append("<html><body>");    // WEBVIEW DOES NOT REFRESH ****************** 

     s.append("<h1 id=11>1111</h1>"); 
     s.append("<script>location.href = '#22';</script>"); 
     for(int i = 0; i < 10; ++i) s.append("<p>"+c+c+c); ++c; 

     s.append("<h1 id=22>2222</h1>"); 
     for(int i = 0; i < 10; ++i) s.append("<p>"+c+c+c); ++c; 
     Log.e("AAAAAA", "content="+s.toString()); 
     s.append("</body></html>"); 
     return s.toString(); 
    } 
    } 
} 
-1
String urlUnique = String.format("http://%s", java.util.UUID.randomUUID().toString()); 
        webView.loadDataWithBaseURL(urlUnique, "<html></html>", "text/html", "UTF-8", null); 
        Thread.sleep(200); 
        webView.loadData(htmlData, "text/html", "UTF-8"); 
11

Pour une raison quelconque, vous devez effacer le contenu d'abord. Les méthodes "load ..." ne semblent pas ajouter explicitement leur contenu mais cela ne fonctionne pas. Je pense que c'était WebView.clearView() mais c'était déprécié. Le doc pour la méthode obsolète sur le Android site vous dit en fait d'utiliser WebView.loadUrl("about:blank") en remplacement de cette méthode. Donc ...

WebView.loadUrl("about:blank"); 
WebView.loadData(data, mime, encoding); 

... fait l'affaire pour moi. Cela semble un peu sale mais je n'oserais pas désobéir à Google! Je ne suis pas sûr si quelqu'un d'autre le fait mais je suis en train de charger une chaîne dans laquelle j'avais lu à partir d'un "actif". Je l'utilise pour afficher des documents d'aide. Donc, je n'utilise aucune URL réelle; J'utilise simplement le WebView comme un moteur de rendu HTML.

Remarque: Pour les débutants (comme moi il y a seulement un mois), assurez-vous de remplacer "WebView" par une instance de votre variable. Ce ne sont pas des méthodes statiques.

0

Vous devez loadDataWithBaseURL dans thread principal

+0

Ajoutez quelques explications sur comment cela aidera OP à résoudre le problème –

1

Ceux qui éprouvent encore la question que j'ai trouvé une solution rapide il suffit d'utiliser un gestionnaire pour ce

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      webView.loadDataWithBaseURL("", html, "text/html", "UTF-8", null); 
     } 
    }, 10) ;