防止Chrome在重新定位时重新加载页面?

时间:2012-11-14 20:34:24

标签: android webview android-webview onconfigurationchanged webchromeclient

这是我的第一个应用程序,它是一个网络应用程序,它只是将一个webView加载到一个发生这种情况的网址。

它在Android浏览器(姜饼)中运行良好,但在Chrome(ICS,JB)中,当设备旋转时,它会返回到初始的webView URL。在姜饼中你通过设置android:configChanges =“keyboard | keyboardHidden | orientation”并覆盖onConfigurationChanged来解释这个问题。

在搜索网络后,我按照此处的示例重新编写了我的原始活动:http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/,您实际上自己处理了重新定位。

但是现在我的应用在旋转设备时崩溃了。

使用Android 4.1.2进行测试。

任何人都看到了我的代码?很抱歉,如果答案很明显,但我已经坚持了几天这个bug。也许我只需要另外一双眼睛。提前谢谢!

注意:@SuppressWarnings(“弃用”)行不在示例中,编辑为了编译而建议。

主要活动:

package com.example.xxx.xxx;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.Menu;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

protected FrameLayout webViewPlaceholder;
protected WebView myWebView;

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

    initUI();

}

   @SuppressWarnings("deprecation")
   protected void initUI() {

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


    if (myWebView == null){
        //Create It
        myWebView = new WebView(this);
        myWebView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setLoadsImagesAutomatically(true);
        myWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        myWebView.setScrollbarFadingEnabled(true);
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.setWebChromeClient(new WebChromeClient());
        myWebView.setInitialScale(1);
        myWebView.loadUrl("http://www.theurl.com");

    }

    webViewPlaceholder.addView(myWebView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public void onConfigurationChanged(Configuration newConfig){   

    if (myWebView != null) {

        webViewPlaceholder.removeView(myWebView);

    }

    super.onConfigurationChanged(newConfig);

    setContentView(R.layout.activity_main);

    initUI();

}


@Override
protected void onSaveInstanceState(Bundle outState)
      {
        super.onSaveInstanceState(outState);

        // Save the state of the WebView
        myWebView.saveState(outState);
      }


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
      {
        super.onRestoreInstanceState(savedInstanceState);

        // Restore the state of the WebView
        myWebView.restoreState(savedInstanceState);
      }
}

主要活动XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="horizontal" >

<FrameLayout android:id="@+id/webViewPlaceholder"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

尝试在清单文件中为活动定义添加方向,如下所示:

<activity android:screenOrientation="portrait"  ...>
</activity>

答案 1 :(得分:0)

我意识到如果我没有使用任何功能,我甚至根本不需要WebChromeClient。在这里找到答案:How to prevent WebView auto refresh when screen rotation

只需将“screenSize”添加到清单中的配置更改即可。

android:configChanges="keyboard|keyboardHidden|orientation|screenSize"