FragmentとViewPagerを使った画面構成の勉強中なのですが、onPause()をオーバーライドしてもいないのにonPause()で強制終了していて、先日軽くハマったので備忘録としてエントリーにしておこうと思います。
まず、不具合の内容。
というものです。
「ViewPagerを使った横スワイプによる画面切り替えで内容をFragmentで作成していた場合、対象Activityがバックグラウンドに回る場合(onPauseとか)に強制終了となる」
というものです。
で、原因はというとSDKのバグのようでして、onSaveInstanceState(Bundle outState)でFragmentの状態保持をしていない場合(すなわち、outStateがnullの場合)にSDKの内部処理でそのnullのBundleにアクセスしてしまうルートがあるのです。
googleへのバグ報告も早々に行われてはいるのですが、まだ対処されてない模様。
まぁ、実際のアプリ制作でFragmentの状態保持しないってことはレアケースですからね^^;
ということで、対策としては、onSaveInstanceState()でダミーの要素をputしとけばOKです。
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Notice: FrameWorkバグ対策。Bundleに何か入れとくとonPause()で落ちないようになる。 if(outState.isEmpty()){ outState.putBoolean("WORKAROUND_FOR_BUG_19917_KEY", true); } }
以上、誰かの役に立てれば幸い。