102

画面を回転すると、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>
4

12 に答える 12

116

主な問題は、web.loadUrl(webURL); を呼び出すことだと思います。また、savedInstanceState != null の場合

編集

試す:

if (savedInstanceState == null)
{
  web.loadUrl(webURL);
}

EDIT2 : onSaveInstanceStateと onRestoreInstanceState のオーバーライドも必要です。

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

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

注: アクティビティ android:configChanges="orientation|screenSize" に AndroidManifest.xml も追加してください。

于 2012-08-26T14:50:18.487 に答える
22

タグ内 (マニフェスト)

android:configChanges="orientation|screenSize"
于 2015-01-15T15:48:57.120 に答える
15

android:configChanges="orientation|screenSize"マニフェストに追加するとうまくいきます

<activity
            android:name="com.example.HelloWorld.WebActivity"
            android:label="@string/title_activity_web"
            android:configChanges="orientation|screenSize" >
</activity>
于 2015-07-14T07:31:14.993 に答える
8

これがうまくいくとは思えません。私の場合、まだ使用して状態を復元WebView.restore(Bundle savedInstanceState)すると、URL のリロードがトリガーされます。

ドキュメントを見ると、次のように書かれrestoreState()ています。

この WebView が状態を構築する機会 (ページの読み込み、戻る/進むリストの作成など) を行った後に呼び出されると、望ましくない副作用が生じる可能性があります。

このメソッドは、この WebView の表示データを復元しないことに注意してください。

彼の答えで正しい方向に私を向けてくれた@e4c5への小道具

そしてもちろん、極端な行動方針は、向きの変更がアクティビティの破壊/作成をトリガーしないようにすることです。これを行う方法に関するドキュメントはこちら

于 2016-12-09T23:13:48.050 に答える
7

このコードをマニフェストに追加します

<activity 
     ...
     android:configChanges="orientation|screenSize">
于 2014-08-25T16:00:39.490 に答える
5

これを Manifest.xml ファイル アクティビティに配置します。

android:configChanges="orientation|screenSize"

次に例を示します。

<activity android:name=".MainActivity"
          android:label="@string/app_name"
          android:theme="@style/AppTheme.NoActionBar"
          android:configChanges="orientation|screenSize">
          <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
</activity>
于 2017-10-05T14:34:34.543 に答える
4

メソッドをオーバーライドして、onConfigChange向きの変更時にデータを再読み込みしないようにします

AndroidMainfestファイル内のあなたの活動について。

android:configChanges="orientation|keyboardHidden" 

これらも WebView 設定に含めます

webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
webview.loadUrl("Your URL To Load");
于 2014-03-18T11:20:13.810 に答える
4

マニフェスト ファイルでこれを試してください。

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
于 2017-10-05T11:12:12.327 に答える