Monday, January 09, 2012

Fragmentでエラー

Android 3.0で追加されたFragmentが使えるかテストをしていたのだが、
XMLでFragmentを含むレイアウトを記載したアプリをGalaraxy Nexusにインストールし画面を回転させたときにアプリが異常停止する。
特に、自分でFragmentクラスを継承させてonCreateViewをオーバーライドしたクラスを、
XML上に配置するとこの異常停止になる。

エラーは下記。
01-09 21:51:39.086: E/AndroidRuntime(5798): Caused by: java.lang.IllegalStateException: Fragment com.bambooflower.fragmenttest.MyFragment did not create a view.
01-09 21:51:39.086: E/AndroidRuntime(5798): at android.app.Activity.onCreateView(Activity.java:4266)
01-09 21:51:39.086: E/AndroidRuntime(5798): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)

このログを頼りに検索すると、XMLを使うな、というQ&Aと、
XMLを使わないプログラマティックな実装方法を紹介しているサイトを発見。

原因はおそらくActivityと異なるライフサイクルでFragmentの画面が形成されるためだろう。

プログラマティックにFragmentを作る方法とは、XMLにはを一切書かないで、
例えばActivityのonCreate実装の中に下記のようにFragment生成文を書くことのようだ。


FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (null == fm.findFragmentByTag(FRAG_TAG)) {
    xact.add(R.id.parent, new MyFragment(), FRAG_TAG);
}
じゃあ何のためにXMLがあるんだろうと不思議に思ってしまうが、これで回避できそうだ。

追記:
確かにこれでエラーは回避できた。
自分で実装したFragmentを静的にレイアウトにのせるのはもうやめようかな、と思う。
今確かめたところ、ListFragmentでonCreateView内でinflateするだけであれば問題ないようだ。

No comments:

Post a Comment