アクティビティの向きの変更中にデータを保存するためにビューレス フラグメントを使用しています。おおよそ次のようになります。
public class BoardActivity extends BaseActivity {
private DataHandler mDataHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initialize the data handler
mDataHandler = (DataHandler)mFragmentManager.findFragmentByTag("data");
if (mDataHandler == null) {
mDataHandler = new DataHandler();
mFragmentManager.beginTransaction().add(mDataHandler, "data").commit();
// initialize the data
mDataHandler.mThreads = ...;
} else {
// here, the data is taken and the ListView is filled again.
fillView();
}
}
public static class DataHandler extends Fragment {
private Topic[] mThreads;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
}
}
何が起こるかというと、アクティビティが残されている場合 (例: ホーム ボタンを使用)、何らかの理由でバックグラウンドで強制終了されると、そのアクティビティの再起動時にアプリがクラッシュします。その理由は、FragmentmDataHandler
は FragmentManager によって検出されますが、そのメンバー変数 ( mThreads
) はnull
.
フラグメント自体は保持できるのに、その変数はゼロに設定されているのはなぜですか?