Android WebViewの画面回転時のリロード

Pocket

Android向けのアプリを作っております。慣れてないので次から次へと問題にぶつかる。たいていの問題はググレばなんとかなるが、掲題ではまったのでメモ。

Androidでは画面を縦から横にすると表示されている内容がリロードされてしまう。表示している内容を再描画するだから、これはまあ仕方がないというか当然の仕様だと思うが、たとえばWebViewでHTMLファイルを表示し、何か入力しているときに画面を縦から横にすると、入力していた内容がきれいさっぱり消えて、ゼロからやり直す羽目になる。こんなアプリは誰も使いたくないだろう。私だって使いたくない。画面が回転したときのリロードを止めねばならない。

それでまあ検索するわけだが、どうも情報が錯綜していてStack Overflowも迷える子羊たちの書き込みでいっぱいであった。Androidのバージョンがらみの問題かもしれないが、「俺はこれでうまくいったぜ」という回答に対し「俺のところではダメだ」というやりとりが多い。解決策としては、Android WebView handling orientation changes あたりが参考になると思う。onSaveInstanceState で現在の状態を保存しておいて、onCreate でsavedInstanceState がnullでなければそれを表示する。さらにonConfigurationChanged で super.onConfigurationChanged(newConfig)し、効くのか効かないのかよく分からないが onRestoreInstanceState で super.onRestoreInstanceState する。

そして、ここからが大事なのだがmanifestに以下を加える。

<activity android:name="..."
          android:label="@string/appName"
          android:configChanges="keyboardHidden|orientation|screenSize">

多くの掲示板で android:configChanges のところを keyboardHidden|orientation とするよう書いてあるが、screenSizeとしないと動かなかった。以下、Activity のソースである。

public class MainActivity extends Activity {
    private WebView wv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wv = (WebView)findViewById(R.id.wv);
        if(savedInstanceState != null){
            ((WebView)findViewById(R.id.wv)).restoreState(savedInstanceState);
            return;
        }
        wv.loadUrl("file:///android_asset/test.html");
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        ((WebView)findViewById(R.id.wv)).saveState(outState);
    }
    @Override
    public void onRestoreInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
}

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください