添加到FrameLayout后,WebView显示错误的内容

时间:2013-12-06 05:09:30

标签: android webview

我正在尝试使用此代码(来自here):

public class StatePreservingImplActivity extends Activity {
  protected FrameLayout webViewPlaceholder;
  protected WebView webView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.state_preserving_impl);

    // Initialize the UI
    initUI();
  }

  protected void initUI() {
    // Retrieve UI elements
    webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));

    // Initialize the WebView if necessary
    if (webView == null) {
      // Create the webview
      webView = new WebView(this);
      webView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
      webView.getSettings().setSupportZoom(true);
      webView.getSettings().setBuiltInZoomControls(true);
      webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
      webView.setScrollbarFadingEnabled(true);
      webView.getSettings().setLoadsImagesAutomatically(true);

      // Load the URLs inside the WebView, not in the external web browser
      webView.setWebViewClient(new WebViewClient());

      // Load a page

    }
    //ATTENTION
    webView.loadUrl("http://MYPAGE.php");
    // Attach the WebView to its placeholder
    webViewPlaceholder.addView(webView);
  }

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    if (webView != null) {
      // Remove the WebView from the old placeholder
      webViewPlaceholder.removeView(webView);
    }

    super.onConfigurationChanged(newConfig);

    // Load the layout resource for the new configuration
    setContentView(R.layout.state_preserving_impl);

    // Reinitialize the UI
    initUI();
  }

在网页视图中,我正在尝试显示使用JavaScript和window.innerWidth / height计算内容大小的页面。开始应用后,一切正常。但是如果我旋转显示(在模拟器上通过NumPad 7或9),webView显示window.innerWidth / height的旧值的内容,尽管webView是重新加载的URL(参见//注意)。如果我旋转设备2或3或4次或更多次,它总是使用与之前状态相对应的值。

调查时间太长但我怀疑在这一行

webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));

我得到了FrameLayout的旧实例,因为新布局没有时间完成加载。 我仍然不明白在这个代码示例中,WebView如何在应用程序启动后链接到FrameLayout之前将宽度和高度的正确值传递给JavaScript。

我试图找到解决方案,但没有成功。我会很高兴得到任何帮助。

P.S。对不起我的英语技能。

1 个答案:

答案 0 :(得分:0)

问题解决了。首先,我找到onContentChanged()事件并移动initUI();从OnConfigurationChanged(..)到它。然后禁用缓存,它工作正常。这是我改变的代码:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    if (mapWebView != null) {
    // Remove the WebView from the old placeholder
        webViewPlaceholder.removeView(mapWebView);
        webView.clearView();
    }

        super.onConfigurationChanged(newConfig);
        // Load the layout resource for the new configuration
        setContentView(R.layout.web_view_layout1);
}


@Override
public void onContentChanged() {
    super.onContentChanged();
    initUI();
}