2012-01-25 1 views
11

저는 웹 뷰에서 두 개의 다른 HTML 문자열을로드 할 수있는 작은 액티비티를 만들었습니다. 액티비티를 실행할 때 page_1 변수에서 String을로드하여 시작합니다. 여태까지는 그런대로 잘됐다. 페이지가 예상대로 표시됩니다. onFling 리스너를 추가하여 액티비티가 page_2 변수의 내용을로드하도록해야합니다. 문제는 onFling이 호출되고 loadUrl이 호출 되어도 webview가 업데이트되지 않는다는 것입니다.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" /> 

나는 누군가가 나를 도울 수 있기를 바랍니다! :-)

안부

의 Stig 앤더슨

+0

Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { webView.loadDataWithBaseURL("", html, "text/html", "UTF-8", null); } }, 10) ; 
에 대한 처리기를 사용하여 발견 된 문제가있는 사람 : // 개발자 .android.com/reference/android/webkit/WebChromeClient.html). 'mWebView.setWebChromeClient (new WebChromeClient());'그렇게해야합니다. – dokkaebi

+0

또한 loadData 호출이 이루어지는 것을 어떻게 알 수 있습니까? 디버거를 단계별로 실행하고 있습니까? 로그 메시지를 인쇄 하시겠습니까? – 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

@Jens : 안녕하세요, Sting Andersen과 같은 문제가있어서 해결해 보았습니다.하지만 여전히 문제는 두 번째로 콘텐츠를로드하지 않는 것입니까? 이 외에 다른 해결책은 무엇이 될 수 있습니까? – Hiral

+0

감사합니다. – Yasin

4

이러한 솔루션은 저에게 적합하지 않았습니다. 무엇 결국 일을하는 것은 (loadData이 경우 근무) 데이터를로드하기 전에 캐시와 역사를 삭제입니다 :이 도움이 될 것입니다

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

희망.

+0

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

+0

로드 방법으로 웹보기를 다시로드 할 때마다 특정 OS 수준 (예 : 4.1.1, 4.4.2)에서 캐시 및 기록 지우기가 필요합니다. 아주 새로운 웹보기의 경우에도 기본 구현은 "오래된"내용을 고수하고 동일한 URL (필자의 경우 null)을 사용하여 더 이상 존재하지 않는 오래된 내용을 입력하고 빈 화면을 미리 표시합니다. 이틀 만에 다른 행동을하는 다른 장치로 벽에 머리를 대고 이틀 만에 나를 구해 냈습니다. 이제는 내 자신의 웹보기를 서브 클래 싱하여 이것을 다시는 잊지 않도록하십시오. – Colin

3

아직도 내가 빠른 해결책은 그냥이

당신이 [WebChromeClient (HTTP를 추가하면 웹 콘솔에서 오류 출력을 얻을 수 있습니다
관련 문제