2012-01-25 13 views
11

मैंने एक छोटी गतिविधि बनाई है जो एक वेबव्यू में दो अलग-अलग HTML स्ट्रिंग लोड करने में सक्षम है। जब मैं गतिविधि चलाता हूं तो यह स्ट्रिंग को पृष्ठ_1 चर से लोड करके शुरू होता है। अब तक सब ठीक है। पृष्ठ अपेक्षित के रूप में दिखाता है। मैंने एक ऑनफ्लिंग श्रोता जोड़ा है जो गतिविधि को पृष्ठ_2 चर की सामग्री को लोड करना चाहिए। समस्या यह है कि भले ही ऑनफलिंग कहा जाता है और loadUrl को वेबव्यू कहा जाता है, अपडेट नहीं किया जाता है?WebView दूसरी बार अपना HTML लोड नहीं करता है?

मेरे गतिविधि इस तरह दिखता है:

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

मेरे लेआउट इस तरह दिखता है:

<?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" /> 

मुझे आशा है कि कोई मेरी मदद कर सकते हैं! :-)

सादर

स्टिग एंडरसन

+0

आप अगर आप एक [WebChromeClient] (http जोड़ने वेब कंसोल से त्रुटि उत्पादन प्राप्त कर सकते हैं के लिए एक हैंडलर का उपयोग कर रहे हैं उन: // डेवलपर .android.com/संदर्भ/एंड्रॉयड/वेबकिट/WebChromeClient.html)। 'mWebView.setWebChromeClient (नया WebChromeClient());' इसे करना चाहिए। – dokkaebi

+0

इसके अलावा, आप कैसे जानते हैं कि लोडडेटा कॉल किए जा रहे हैं? क्या आप डीबगर के साथ आगे बढ़ रहे हैं? प्रिंट लॉग संदेश? – dokkaebi

उत्तर

9

पहले, प्लेग की तरह WebView#loadData(String, String, String) से बचने की कोशिश - यह एक गाड़ी p.o.s. है इसके बजाय WebView#loadDataWithBaseURL(String, String, String, String, String) का उपयोग करें।

आगे, यह आपकी समस्या को ठीक करेगा। काउंटर-अंतर्ज्ञानी मुझे पता है, लेकिन हे, यह एंड्रॉइड तरीका है।

@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

हाय जेन्स, तुम मेरे नायक हो! मेरी मदद करने के लिए धन्यवाद! :-) –

+1

@ जेन्स: हाय, मुझे स्टिंग एंडर्सन जैसी ही समस्या है और आपने अपना समाधान आजमाया है। लेकिन फिर भी, दूसरी बार सामग्री लोड नहीं करने के लिए समस्या है? क्या आप मुझे बता सकते हैं, इसके अलावा अन्य समाधान क्या हो सकता है? – Hiral

+0

धन्यवाद, यह काम करता है। – Yasin

4

ये समाधान मेरे लिए काम नहीं करते थे। क्या अंततः काम किया डेटा लोड करने से पहले कैश और इतिहास साफ़ करने है (loadData इस मामले में काम किया):

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

आशा इस में मदद मिलेगी।

+0

webView.loadDataWithBaseURL (शून्य, एचटीएमएल, शून्य, "utf-8", शून्य); – Yasin

+0

कुछ ओएस स्तरों पर साफ़ कैश और इतिहास की आवश्यकता होती है (उदा। 4.1.1, लेकिन 4.4.2 नहीं) जब भी कोई वेब व्यू लोड विधि के साथ पुनः लोड किया जाता है। यहां तक ​​कि एक ब्रांड के नए वेब व्यू के लिए - अंतर्निहित कार्यान्वयन "पुरानी" सामग्री पर प्रतीत होता है और पुरानी सामग्री की कुंजी के लिए एक ही यूआरएल (मेरे मामले में शून्य) का उपयोग करता है जो अब मौजूद नहीं है और हे एक खाली डिस्प्ले को प्रतिष्ठित करता है। दो दिन, इसने मुझे अलग-अलग उपकरणों वाले विभिन्न उपकरणों वाले दीवार के खिलाफ अपने सिर को टक्कर देने के दो दिन बाद बचाया। अब अपने स्वयं के वेब व्यू को उप-वर्गीकृत करने के लिए ताकि इस बारे में फिर से न भूलें। – Colin

3

जो अभी भी इस मुद्दे को मैंने पाया एक त्वरित समाधान सिर्फ इस

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