【问题标题】:LoadURL/goBack Not Working When Called From onFling in WebView从 WebView 中的 onFling 调用时,LoadURL/goBack 不起作用
【发布时间】:2011-03-17 21:44:30
【问题描述】:

通过查看此处的其他帖子,我已经能够让我的 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();
    }
}

}

【问题讨论】:

    标签: android webview onfling


    【解决方案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;
                }
            }
    );
    

    所以总是返回假,尽管检测器返回真。我知道这不是应有的方式,但它对我有用。

    【讨论】:

    • 感谢 alf,这对我有用。由于我无法弄清楚这一点,我实现了一个 GestureOverlayView。它也有效,但我想使用 GestureDetector 会更有效。
    【解决方案2】:

    阿尔夫在正确的轨道上。需要将“setOnTouchListener”添加到 webview,但不需要在gestureDector 上添加。这是完整的解决方案...

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2019-12-01
      • 2015-03-17
      相关资源
      最近更新 更多