みなさん、Fragment使ってますか、Fragment。

最近Androidやってません。ryosmsです


さて、Activity#onDestroyでFragmentの操作するのは仕様で禁止されてるってのは常識ですよね?私は昨日知りました(だってonDestroyとかめったに使わないし、普通はそんなところでFragment操作するようなことないもん)


参考:[Android] Activity#onDestroyではFragmentTransactionの操作はできない | うら紙のメモ


ところが、ですよ。

なんとActivity#onResumeで呼んでるFragmentTransaction#commitに対してIllegalStateExceptionが「can not perform this action after onSaveInstanceState」とか言い出したんですよ。


というわけで回避策のメモ


一応、環境とか前提条件とか

  • もともとのアプリはAndroid2.x(主に2.2、2.3)がターゲット
  • Android3.x対応&アプリの修正の際にFragment化
  • Support Library v4を使用
  • onResumeで落ちるのはAndroid4.xのみ
 
#困ったときのstackoverflow ということで、普通に回避策がstackoverflowに載ってました
android - IllegalStateException - Fragment support library - Stack Overflow

原因はAndroidManifest.xmlのuses-sdkのtargetSdkVersionでした。
<uses-sdk
    maxSdkVersion="x"
    minSdkVersion="x"
    targetSdkVersion="8" />

<uses-sdk
    maxSdkVersion="x"
    minSdkVersion="x"
    targetSdkVersion="17" />
にしたら直ったよ!
(このアプリではないけど)最近のLintだとtargetSdkVersionに古いSdkVersion指定してると怒られたのはこのせいか #知らんけど
以上!

Special Thanks @zaki50

(てか、上記の記事にも載ってるけど、FragmentActivity#onResumeFragmentとかあるの知らんかった)