LoadURL / goBack не работает при вызове из onFling в WebView - PullRequest
1 голос
/ 18 марта 2011

Просматривая другие посты здесь, я смог заставить мой WebView реагировать на свипы, но с некоторыми проблемами. То, что я пытаюсь сделать, это сделать движение вправо-влево, точно так же, как кнопка возврата в моей деятельности. Это означает, что иногда нужно вызвать webview.goBack или LoadURL, чтобы перейти на предыдущую страницу, или я нахожусь на верхней веб-странице, вызывающей super.onBackPressed, чтобы закрыть текущее веб-представление.

Последний случай работает отлично, но элементы управления браузером работают только частично. Если я открою веб-просмотр и углублюсь на две страницы, а затем проведу назад один раз, я не вижу никаких изменений. Если я снова проведу пальцем назад, веб-просмотр закроется. Это означает, что предыдущая веб-страница была загружена с первого пролистывания, но по какой-то причине она не отображалась на экране. Если я использую кнопку «Назад» на устройстве (которая вызывает ту же функцию, что и моя функция onFling), дисплей обновляется, как и ожидалось. Кто-нибудь знает, что может быть причиной такого поведения? Имеет ли это какое-то отношение к событиям движения веб-просмотра, переопределяющим какое-либо действие?

Соответствующие фрагменты кода приведены ниже. Спасибо за внимание.

открытый класс WebBrowser расширяет активность ... {

    ...

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 ]

1 голос
/ 12 февраля 2012

Альф на правильном пути. «SetOnTouchListener» необходимо добавить в веб-просмотр, но не нужно использовать Kludge в gestDector. Вот полное решение ...

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

Это может быть расширено другими шагами и другими событиями движения.

1 голос
/ 04 мая 2011

У меня была такая же проблема.Попробуйте:

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

Так что возвращайте всегда false, хотя детектор вернул true.Я знаю, что это не так, как должно быть, но у меня это сработало.

...