Android WebView не обновляется после изменения содержимого веб-просмотра с помощью JavaScript - PullRequest
17 голосов
/ 29 февраля 2012

Мое приложение использует WebView с прозрачным фоном, в котором некоторые свойства стиля элементов модифицируются JavaScript.

Проблема: WebView не обновляется в соответствии с измененными свойствами.Когда WebView перерисовывается (например, из-за изменения ориентации пользователя), WebView обновляется правильно.Я воспроизвел проблему на Android 3.2 (на Samsung GT), но на Android 2.1 и 4.3 все работает нормально.

Пример кода, который воспроизводит проблему:
Очевидно, что при первом касании изображения оно должно исчезнуть,и нажмите на второй должен переместить его.Если цвет фона WebView изменяется на непрозрачный, или если я удаляю изображение, отображаемое под WebView, все работает нормально ...

HTML, загруженный веб-представлением.:

<!DOCTYPE html>
<html>
    <body >     
        <img style="position:absolute;left:0px" onclick="this.style.display='none';" 
            src="http://flv.justad.tv/gallery/assets/trickplay/justad/tp-pause.png" />  

        <img style="position:absolute;left:200px" onclick="this.style.top='200px';" 
            src="http://flv.justad.tv/gallery/assets/trickplay/justad/tp-ff.png" />

    </body>
</html>

Файл макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >

     <ImageView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:scaleType="fitXY"
                android:src="@drawable/display_background" />

    <RelativeLayout android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:id="@+id/WebviewContainer">

    </RelativeLayout>

</RelativeLayout>

Приложение Activity:

    public class TestImageMoveActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        RelativeLayout webviewContainer =        
                  (RelativeLayout)findViewById(R.id.WebviewContainer);
        WebView web = new WebView(this);
        web.getSettings().setJavaScriptEnabled(true);
        web.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        web.setLayoutParams(
                new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
        web.setBackgroundColor(Color.TRANSPARENT);

        webviewContainer.addView(web);

        web.loadUrl("http://192.168.1.12/myWeb/localTmp/testImageMove.html");
    }
}

Снимок экрана перед касанием:

Снимок экрана до касания
Снимок экрана после касания обоих изображений

Ответы [ 3 ]

0 голосов
/ 01 июля 2015

попробуйте вручную перезагрузить веб-просмотр: - web.reload()

0 голосов
/ 31 июля 2015

Создайте метод для обновления веб-просмотра, например void refreshWebview(WebView webView) { webView.reload(); }

, вызовите refreshWebview () из вашего javaScript или из вашего кода с помощью интерфейса.

0 голосов
/ 28 января 2013

Я столкнулся с подобной проблемой.Проблема возникает потому, что вы должны сохранить состояние вашего WebView во время изменения ориентации.Без этого веб-страница считается загружаемой в первый раз.Это означает, что любые изменения, которые были применены динамически с JavaScript, полностью потеряны.

Предпочтительный / правильный путь: В зависимости от сложности вашего веб-сайта, это может потребовать небольшой работы, поскольку для этого нет встроенного способа.Вы должны вручную обработать, какие динамические изменения необходимо сохранить в самом JavaScript.Высокоуровневое представление шагов, которые необходимо предпринять:

  1. Активность onSaveInstanceState() вызывает функцию JavaScript, например, saveState ()
  2. saveState () записывает необходимую информацию в хранилище DOM, например localStorage.
  3. Активность onRestoreInstanceState() вызывает функцию JavaScript, IE restoreState ()
  4. restoreState () загружает информацию из хранилища DOM и обновляет веб-страницу до исходного состояния.

Дурной совет, но простой способ: Переопределите ваши действия configChanges в манифесте.Это предотвратит повторное создание активности и, следовательно, веб-страница не должна перезагружаться.

Дальнейшее чтение: Информация о воссоздании Действия из сохраненного состояния Плюсы / минусы в переопределении configChanges

...