2012-01-25 15 views
11

私は、Webビューに2つの異なるHTML文字列を読み込むことができる小さなアクティビティを作成しました。アクティビティを実行すると、まずpage_1変数からStringをロードします。ここまでは順調ですね。期待どおりのページが表示されます。 onFlingリスナーを追加しました。このリスナーは、アクティビティでpage_2変数の内容をロードする必要があります。 問題は、onFlingが呼び出され、loadUrlが呼び出されてもwebviewが更新されない場合です。WebViewで2度目のHTMLが読み込まれませんか?

私の活動は次のようになります。私は、誰かが私を助けることができると思います

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

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

私のレイアウトは、このようになります! :-)

敬具

スティグ・アンデルセン

+0

のハンドラを使用した簡単な解決策を見つけた問題持っている人://開発者を.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)を使用してください。

これにより、問題が解決されます。カウンター直感私は知っているが、ねえ、それは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

こんにちはジェンス、あなたは私のヒーローです!私の助けてくれてありがとう! :-) –

+1

@Jens:こんにちは、私はSting Andersenと同じ問題を抱えていましたが、解決策を試しました。でも、問題は2回目のコンテンツの読み込みではありませんか?これ以外の解決法は他に何ができるのでしょうか? – Hiral

+0

ありがとう、それは動作します。 – Yasin

4

これらのソリューションは私にとっては役に立たなかった。最終的には、データをロードする前にキャッシュと履歴を消去しています(この場合はloadData)。

希望すると便利です。

+0

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

+0

特定のOSレベル(4.1.1では4.4.2ではなく)でキャッシュと履歴を消去する必要があります。これは、どちらかの方法でWebビューを再読み込みするたびに発生します。まったく新しいWebビューであっても、基本的な実装は「古い」コンテンツを保持しているように見え、同じURL(私の場合はnull)を使用して、もはや存在しない古いコンテンツをキー入力し、空の表示にします。 2日間、これはちょうど2日後、違った行動をしているさまざまなデバイスで壁に頭をぶつけて私を救った。今度は私のWebビューをサブクラス化して、これをもう一度忘れないようにしてください。 – Colin

3

まだ私はちょうどあなたが[WebChromeClient](HTTP追加する場合は、Webコンソールからのエラー出力を得ることができ、この

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