2012-02-29 90 views
15

我的应用程序使用透明背景的WebView,其中元素的某些样式属性由JavaScript修改。在webview内容被JavaScript修改后,Android WebView未刷新

问题:WebView未根据修改的属性进行刷新。当WebView重新绘制(例如,由于用户方向更改)时,WebView已正确更新。 我在Android 3.2(在三星GT)上重现了这个问题,但在Android 2.1和4.3上都很好。

重现问题的示例代码:
很明显,当第一个图像被点击时,它应该消失,点击第二个图标应该移动它。如果WebView的背景颜色更改为不透明,或者如果我删除显示在WebView下方的图像,所有工作都会正常...

HTML由Web视图加载。 :

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

屏幕截图:

Screen shot before tap
Screen shot after tap on both images

+1

您的屏幕截图链接已损坏(权限被拒绝)。 – 2012-02-29 13:58:25

+0

对不起,链接应该现在工作 – hailrok 2012-02-29 14:25:34

+0

不需要道歉,只是说你注意到它。 :) – 2012-02-29 14:26:20

回答

0

我遇到了类似的问题。出现此问题的原因是您必须在方向更改期间保存WebView的状态。如果不这样做,网页将被视为第一次加载。这意味着使用JavaScript动态应用的任何更改都会完全丢失。

的首选/正确的方法:
取决于你的网络的复杂性,因为有一个在方式这样做没有内置这可能需要一点点的工作。您必须手动处理需要在JavaScript本身内保存的动态更改。要采取的步骤的高级视图:

  1. 活动的onSaveInstanceState()调用JavaScript函数,例如, saveState()
  2. saveState()将必要的信息记录到DOM存储器,例如, localStorage
  3. 活动的onRestoreInstanceState()调用JavaScript函数,IE restoreState()
  4. restoreState()从DOM存储装载信息并将网页更新为原始状态。

的不明智的,但简单的方法:
重写你的活动configChanges清单内。这将阻止活动被重新创建,因此网页不应该重新加载。

延伸阅读:
Information about recreating an Activity from saved state
Pros/Cons to overriding configChanges

0

尝试手动刷新网页流量: - web.reload()

0

做一个方法来刷新网页视图 前 void refreshWebview(WebView webView) { webView.reload(); }

从您的javaScript或使用接口的代码中调用refreshWebview()。