Monday, February 27, 2017

FragmentActivity.SupportFragmentManagerでハマる

Androidの厄介な仕様の1つが、アクティビティのライフサイクルです。
本体を回転させた時や、戻るボタンを押したりすると、何故かアクティビティのインスタンスが破棄され、再作成が起こります。
例えばアプリ内で途中のページを見ている時に画面を回転すると、起動直後のように最初のページに戻るというイライラする動きになります。元のページが表示された状態にするには、わざわざ復元するコードを書く必要があります。
で、今のアプリは、Android.Support.V4ライブラリのFragmentActivity,ViewPagerを使っているのですが、再作成が発生した後にViewPagerの開いていたページに飛ばすと、中身の表示がおかしくなるバグの原因がわからず苦労しました。
ViewPagerのページは、Xamarinの場合CurrentItemプロパティで参照・設定するのですが、ページに割り付けたフラグメントは、SupportFragmentManager.FragmentsのList順序と一致するものと思っていたのです。ところがアクティビティのOnCreateで、CurrentItemを途中のページ(0以外)にするとList順序が変わってしまうのです。ということで、リストのインデックスを使わずにFragmentのインスタンスにタグをつけて検索するようにしたところ、再作成時に途中のページを表示することができました。あぁ面倒くさい。