我有一個容器的片段和NavigationDrawer的活動。如果我在抽屜中選擇一個項目,我打電話給updatePage(index)
。片段和後臺有時會搞砸
我也打電話updatePage(0)
如果我創建活動和savedInstanceState == null
來啓動我的活動。
一個片段有一個子片段,因此它只是通過子片段替換自己,並將子片段添加到後臺堆棧,以便用戶可以導航回到前一個片段。在這個片段我打電話下面的代碼直接:
@Override
public void onClick(View view)
{
Event event = (Event)view.getTag();
FragmentManager fm = getActivity().getSupportFragmentManager();
GamesFragment f = new GamesFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(GamesFragment.KEY_EVENT, event);
f.setArguments(bundle);
FragmentTransaction ft = fm.beginTransaction()
.replace(R.id.frame_container, f, f.getClass().getName())
.addToBackStack(null);
ft.commit();
}
爲什麼有時老片段不行去除?我覆蓋了碎片,但有時只是。
我的活動updatePage
功能看起來像以下:
private void updatePage(int drawerSelection)
{
mDrawer.closeDrawer();
Fragment f = null;
FragmentManager fm = getSupportFragmentManager();
switch (drawerSelection)
{
case 0:
f = fm.findFragmentByTag(HomeFragment.class.getName());
if (f == null)
f = new HomeFragment();
break;
case 1:
f = fm.findFragmentByTag(EventFragment.class.getName());
if (f == null)
f = new EventFragment();
break;
default:
break;
}
if (f != null && !f.isAdded())
{
// SOLUTION:
// Backstack clearen
// fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frame_container, f, f.getClass().getName());
ft.commit();
}
}
其實,我現在明白爲什麼會發生這種情況...將發佈一個簡短的解決方案 – prom85