2012-02-29 4 views
15

В моем приложении используется WebView с прозрачным фоном, в котором некоторые свойства стиля элементов изменены JavaScript.Android 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> 

Layout File:

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

Снимок экрана до того крана:

Screen shot before tap
Screen shot after tap on both images

+1

Ваши ссылки на скриншот повреждены (разрешение отклонено). –

+0

Извините за это ... Ссылки должны теперь работать – hailrok

+0

Не нужно извиняться, просто говоря, что вы это заметили. :) –

ответ

0

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

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

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

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

Дополнительная литература:
Information about recreating an Activity from saved state
Pros/Cons to overriding configChanges

0

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

0

сделать метод обновления Webview экс void refreshWebview(WebView webView) { webView.reload(); }

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

Смежные вопросы