2012-01-25 16 views
11

Ho creato una piccola attività che è in grado di caricare due diverse stringhe HTML in una webview. Quando eseguo l'attività, inizia caricando la stringa dalla variabile page_1. Fin qui tutto bene. La pagina mostra come previsto. Ho aggiunto un listener onFling che dovrebbe consentire all'attività di caricare il contenuto della variabile page_2. Il problema è che anche se viene chiamato onFling e si chiama loadUrl, la webview non viene aggiornata?WebView non carica il mio codice HTML la seconda volta?

La mia attività è simile al seguente:

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.webkit.WebView; 

public class Test extends Activity { 
private GestureDetector mGestureDetector; 
private WebView mWebView; 
private int mPageIndex; 

private static final String page_1 = "<html><body>Hello page 1</body></html>"; 
private static final String page_2 = "<html><body>Hello page 2</body></html>"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 
    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.loadData(page_1, "text/html", "utf-8"); 
    setupGestureDetection(); 
    mPageIndex = 0; 
} 

private void setupGestureDetection() { 
    mGestureDetector = new GestureDetector(new MyGestureDetector()); 
    mWebView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     return mGestureDetector.onTouchEvent(event); 
    } 
    }); 
} 

class MyGestureDetector extends GestureDetector.SimpleOnGestureListener { 
    private static final int SWIPE_DISTANCE_THRESHOLD = 120; 
    private static final int SWIPE_VELOCITY_THRESHOLD = 200; 

    private boolean isHorizontalSwipe(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    if (Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
     if (Math.abs(e1.getX() - e2.getX()) > SWIPE_DISTANCE_THRESHOLD) { 
     return true; 
     } 
    } 
    return false; 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    if (isHorizontalSwipe(e1, e2, velocityX, velocityY)) { 
    if (e1.getX() > e2.getX()) { 
     // Right to left 
     if (++mPageIndex % 2 == 0) { 
     mWebView.loadData(page_1, "text/html", "utf-8"); 
     } else { 
     mWebView.loadData(page_2, "text/html", "utf-8"); 
     } 
     return true; 
    } 
    } 
    return false; 
} 
} 
} 

mio layout si presenta così:

<?xml version="1.0" encoding="utf-8"?> 
<WebView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/webview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

Spero che qualcuno mi può aiutare! :-)

migliori saluti

Stig Andersen

+0

È possibile ottenere output di errore dalla console Web se si aggiunge un [WebChromeClient] (http: // sviluppatore .android.com/riferimento/android/webkit/WebChromeClient.html). 'mWebView.setWebChromeClient (new WebChromeClient());' dovrebbe farlo. – dokkaebi

+0

Inoltre, come si conoscono le chiamate loadData effettuate? Stai facendo un passo con il debugger? Stampa dei messaggi di registro? – dokkaebi

risposta

9

In primo luogo, cercare di evitare WebView#loadData(String, String, String) come la peste - è un p.o.s. buggy Utilizzare invece WebView#loadDataWithBaseURL(String, String, String, String, String).

Inoltre, questo risolverà il tuo problema. Controintuitivo Lo so, ma hey, è il modo Android.

@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if (isHorizontalSwipe(e1, e2, velocityX, velocityY)) { 
      if (e1.getX() > e2.getX()) { 
       // Right to left 
       if (++mPageIndex % 2 == 0) { 
        mWebView.loadDataWithBaseURL(null, page_1, null, "utf-8", null); 
       } else { 
        mWebView.loadDataWithBaseURL(null, page_2, null, "utf-8", null); 
       } 
       // Seriously. You must return false for the loadDataWithBaseURL to work. Not kidding. So you could skip this return. 
       return false; 
      } 
     } 
     return false; 
    } 
+0

Ciao Jens, sei il mio eroe! Grazie per l'aiuto! :-) –

+1

@Jens: Ciao, ho avuto lo stesso problema di Sting Andersen e ho provato la tua soluzione. Ma ancora, il problema è lì per non caricare il contenuto la seconda volta? puoi dirmi, cos'altro può essere la soluzione oltre a questo? – Hiral

+0

grazie, funziona. – Yasin

4

Queste soluzioni non hanno funzionato per me. quello che alla fine ha lavorato è svuotare la cache e la storia prima di caricare i dati (loadData lavorato in questo caso):

webView.clearCache(true); 
webView.clearHistory(); 
webView.loadData(html, "text/html", "UTF-8"); 

Spero che questo vi aiuterà.

+0

webView.loadDataWithBaseURL (null, html, null, "utf-8", null); – Yasin

+0

La pulizia della cache e della cronologia è necessaria su determinati livelli del sistema operativo (ad esempio 4.1.1, ma non 4.4.2) ogni volta che una vista Web viene ricaricata con entrambi i metodi di caricamento. Anche per una nuova vista web - l'implementazione sottostante sembra trattenere il contenuto "vecchio" e usa lo stesso URL (null nel mio caso) per inserire il vecchio contenuto che non esiste più e presto una visualizzazione vuota. Due giorni, questo mi ha appena salvato dopo due giorni di sbattere la testa contro un muro con diversi dispositivi che hanno un comportamento diverso. Ora per creare una sottoclasse della mia vista web in modo da non dimenticarlo più. – Colin

3

Coloro che stanno ancora avendo il problema ho trovato una soluzione rapida basta usare un gestore per questo

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