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){
1.restoreState(savedInstanceState);
return;
}
wv.loadUrl("file:///android_asset/test.html");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
2.saveState(outState);
}
@Override
public void onRestoreInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
}
1件のコメント