在WebView中从onFling调用时,LoadURL / goBack不起作用

时间:2011-03-17 21:44:30

标签: android webview onfling

通过查看其他帖子,我已经能够让我的WebView响应滑动 - 但有一些问题。我想要完成的是做一个从右到左的滑动动作就像我活动中的后退按钮一样。这意味着有时会调用webview.goBack或LoadURL转到上一页,或者如果我在顶级网页上调用super.onBackPressed来关闭当前的webview。

后一种情况很有效,但浏览器控件只能部分工作。如果我打开webview并深入两页,然后向后滑动一次,我看不到任何变化。如果我再次向后滑动,则会关闭webview。这意味着先前的网页已在第一次后滑动中加载,但由于某种原因它未显示在屏幕上。如果我使用设备的后退按钮(它调用与我的onFling完全相同的功能),显示将按预期刷新。有谁知道可能导致这种行为的原因是什么?是否与在某处覆盖某个动作的webview动作事件有关?

相关的代码片段如下。谢谢你看看。

公共类WebBrowser扩展了Activity ... {

    ...

GestureDetector gestureDetector;

SimpleOnGestureListener gestureListener = new SimpleOnGestureListener() {

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY && Math.abs(e2.getX() - e1.getX()) > SWIPE_MIN_DISTANCE) {
            goBack();
            return true;
        }
        return false;
    }
};

public void onCreate(Bundle savedInstanceState) {
        ...
    gestureDetector = new GestureDetector(gestureListener);
    wv.setOnTouchListener(
            new View.OnTouchListener() {
                public boolean onTouch(View wv, MotionEvent event) {
                if(gestureDetector.onTouchEvent(event)) return true;
                return false;
            }
    }
    );

private void goBack() {
    if (backURL.equals("close")) {
        super.onBackPressed();
    } else if (!backURL.equals("")) {
        wv.loadUrl(backURL);
    } else if (wv.canGoBack()) {
        wv.goBack();
    } else {
        super.onBackPressed();
    }
}

}

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。尝试:

public void onCreate(Bundle savedInstanceState) {
    ...
gestureDetector = new GestureDetector(gestureListener);
wv.setOnTouchListener(
        new View.OnTouchListener() {
            public boolean onTouch(View wv, MotionEvent event) {
                gestureDetector.onTouchEvent(event);
                return false;
            }
        }
);

所以尽管检测器返回true,但总是返回false。我知道这不是应该的样子,但它对我有用。

答案 1 :(得分:1)

Alf走在正确的轨道上。需要将“setOnTouchListener”添加到webview中,但不需要在gestureDector上使用kludge。这是完整的解决方案......

    // LOAD WEBVIEW WITH HTML
    wv.loadDataWithBaseURL(null, htmlSource, "text/html", "utf-8", null);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    // GESTURE DETECTOR: FLINGLEFT
    gestureDetector = new GestureDetector(this,
            new GestureDetector.SimpleOnGestureListener() 
    {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
        {
            if (e1.getX() - e2.getX() > LARGE_MOVE)
            {
                setResult(Activity.RESULT_OK, new Intent().putExtra("GESTURE", "FLINGLEFT"));
                finish();
            }
            return false;
        }
    });

    // SET ON TOUCH LISTENER
    wv.setOnTouchListener(
            new View.OnTouchListener() {
                public boolean onTouch(View wv, MotionEvent event) {
                    gestureDetector.onTouchEvent(event);
                    return false;
                }
            }
    );

这可以通过其他动作和其他动作事件进行扩展。