friendListFragmentとlogListFragmentの2つのフラグメントがあります。
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
FriendListFragment friendListFragment = (FriendListFragment)fm.findFragmentById(R.id.friend_list_fragment_container);
LogListFragment logListFragment = (LogListFragment)fm.findFragmentById(R.id.log_list_fragment_container);
後者は、前者のonListItemClickイベントのコンテキストで作成されます。
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
logListFragment = LogListFragment.newInstance(name);
ft.add(R.id.log_list_fragment_container, logListFragment);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
ft.hide(friendListFragment);
}
ft.addToBackStack(null);
ft.commit();
onListItemClickを呼び出すたびに、最初にバックスタックをクリアします。これは、バックスタックに最新のlogListFragmentのみが必要だからです。
私のアクティビティのonCreate関数では、電話の向きに注意を払っています。ポートレートモードでは、バックスタックをクリアし、次の方法でlogListFragmentを再度追加します。
if ((logListFragment != null) && (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)) {
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
ft.add(R.id.log_list_fragment_container, logListFragment);
ft.hide(friendListFragment);
ft.addToBackStack(null);
ft.commit();
}
その後、friendListFragmentは期待どおりに非表示になりますが、 logListFragmentも表示されません。次のようにコードを変更すると、期待どおりに機能します。
if ((logListFragment != null) && (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)) {
LogListFragment copy = new LogListFragment();
copy.setArguments(logListFragment.getArguments());
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
ft.add(R.id.log_list_fragment_container, copy); // <- use copy
ft.hide(friendListFragment);
ft.addToBackStack(null);
ft.commit();
}
LogListFragmentの新しいインスタンスを追加すると、機能します。
質問:
- 新しいインスタンスを作成する必要があるのはなぜですか?
- 誰かがより良い解決策を知っていますか?