我有MainActivity
,使用content_container
加載Fragments
。使用嵌套分段管理後退按鈕
在其中一個Fragment
我也有一個sub_container
加載Fragments
。
在MainActivity
我管理的後退按鈕用棧的Fragment
:
public Fragment addFragmentToStack(Fragment fragment){
if(fragmentStack.size()>MAX_NUM_FRAGMENTS){
fragmentStack.remove(0);
}
return fragmentStack.push(fragment);
}
@Override
public void onBackPressed() {
if (fragmentStack.size() > 0) {
fragmentStack.pop();
if (MyApplication.fragmentStack.size() > 0) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_container, fragmentStack.peek());
ft.commit();
}
}
}
,每當我想取代我content_container
一個Fragment
我用
Fragment someFragment = new SomeFragment();
fragmentTransaction.replace(R.id.content_container, ((MainActivity)getActivity()).addFragmentToStack(someFragment), "");
fragmentTransaction.commit();
一個Fragment
是一個畫廊,一個菜單加載一個photos
或一個videos
Fragment
它(所以畫廊是父母Fragment
和th e照片和視頻Fragments
是兒童)。
爲了能夠添加的照片庫和視頻庫中的堆棧,我在GalleryFragment使用:
if(mType.equals("photos")){
Fragment videoFragment = new VideoFragment();
fragmentTransaction.replace(R.id.sub_container, videoFragment, "");
((MainActivity)getActivity()).addFragmentToStack(this);
}
else{
Fragment photoFragment = new PhotoFragment();
fragmentTransaction.replace(R.id.sub_container, photoFragment, "");
((MainActivity)getActivity()).addFragmentToStack(this);
}
即我在堆棧中添加父GalleryFragment
。
當我從視頻到照片廊,比如去,然後按回Button
,在MainActivity
的onBackPressed
被執行的代碼,並且當前GalleryFragment
實例由實例在棧所取代,但其sub_container
爲空(不調用onCreateView
或onResume
)。
有人可以幫忙嗎?
這種方法是有問題的。永遠不要用構造函數實例化片段,也不要保留對它的引用。系統可以隨時摧毀你的片段,這就是爲什麼你總是應該使用FragmentManager方法'getFragmentByTag'。 – wkarl 2015-02-10 09:54:05
@DrJerkberg:「永遠不要用構造函數實例化碎片」。爲什麼? – jul 2015-02-12 08:33:44
下面是一個解釋:http://stackoverflow.com/a/9245510/2427585 – wkarl 2015-02-13 14:41:40