Android - 防止 WebView 在旋转时重新加载

107

当我旋转屏幕时,WebView会重新加载整个页面。这对我来说是不可接受的,因为我的某些内容包含动态/随机材料。目前,当旋转屏幕时,它会重新加载从loadUrl()方法中的原始URL。

有任何想法我的代码有什么问题吗?

MainActivity.java

package com.mark.myapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    WebView web;
    String webURL = "http://www.google.co.uk/";

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

        if (savedInstanceState != null)
            ((WebView)findViewById(R.id.web)).restoreState(savedInstanceState);

        web = (WebView) findViewById(R.id.web);
        web.getSettings().setJavaScriptEnabled(true);
        web.loadUrl(webURL);
        web.setPadding(0, 0, 0, 0);
        web.getSettings().setLoadWithOverviewMode(true);
        web.getSettings().setUseWideViewPort(true);
        web.getSettings().setSupportZoom(true);
        web.getSettings().setBuiltInZoomControls(true);

        web.setWebViewClient(new HelloWebViewClient());
    }

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

    private class HelloWebViewClient extends WebViewClient {
        public boolean shouldOverrideUrlLoading(WebView web, String url) {
            web.loadUrl(url);
            return true;
        }
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
            web.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mark.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"

            android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

1
我个人使用过并且推荐的简化解决方案在这里:http://twigstechtips.blogspot.com/2013/08/android-retain-instance-of-webview.html - Andrius Baruckis
12个回答

4
如下所述:
引用自这里

注意:从Android 3.2(API级别13)开始,“屏幕大小”在设备在纵向和横向方向之间切换时也会更改。因此,如果您想要防止由于方向更改而导致运行时重启(在minSdkVersion和targetSdkVersion属性声明的API级别13或更高版本中开发),则必须除了“orientation”值外还包含“screenSize”值。也就是说,您必须声明android:configChanges="orientation|screenSize"。但是,如果您的应用程序针对API级别12或更低版本,则您的Activity始终会自己处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的Activity)。

android:configChanges="orientation|screenSize"设置为您的Activity将解决此问题。
此外,请注意以下内容:

记住:当您声明Activity来处理配置更改时,您负责重置任何为其提供替代方案的元素。如果您将Activity声明为处理方向更改并且有应该在横向和纵向之间更改的图像,则必须在onConfigurationChanged()期间为每个元素重新分配每个资源。


1
在Androidmanifest.xml中添加以下内容:
<activity android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">

现在,当这些配置之一更改时,MyActivity 不会重新启动。相反,MyActivity 会收到一个调用 onConfigurationChanged() 的通知。
添加如下内容:
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接