LoadURL/goBack не работает при вызове из onFling в WebView
Просматривая другие посты здесь, я смог заставить мой 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 ответа
У меня такая же проблема. Пытаться:
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. Я знаю, что это не так, как должно быть, но это сработало для меня.
Альф на правильном пути. "SetOnTouchListener" необходимо добавить в веб-представление, но необходимость в жесте не нужна. Вот полное решение...
// 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;
}
}
);
Это может быть расширено другими шагами и другими событиями движения.