2013-04-29 32 views
0

我有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或一個videosFragment它(所以畫廊是父母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,在MainActivityonBackPressed被執行的代碼,並且當前GalleryFragment實例由實例在棧所取代,但其sub_container爲空(不調用onCreateViewonResume)。

有人可以幫忙嗎?

回答

0

好吧,將相同的實例添加到堆棧並不是一個好主意。相反,如果我添加一個新的實例,它完美的作品,即:中

代替

((MainActivity)getActivity()).addFragmentToStack(this); 

使用

GalleryFragment fragment = new GalleryFragment(); 
Bundle bundle = new Bundle(); 
bundle.putString("type", "photos"); // or bundle.putString("type", "videos"); 
            // in order to know what to load once in there 
fragment.setArguments(bundle); 
((MainActivity)getActivity()).addFragmentToStack(fragment); 
+0

這種方法是有問題的。永遠不要用構造函數實例化片段,也不要保留對它的引用。系統可以隨時摧毀你的片段,這就是爲什麼你總是應該使用FragmentManager方法'getFragmentByTag'。 – wkarl 2015-02-10 09:54:05

+0

@DrJerkberg:「永遠不要用構造函數實例化碎片」。爲什麼? – jul 2015-02-12 08:33:44

+0

下面是一個解釋:http://stackoverflow.com/a/9245510/2427585 – wkarl 2015-02-13 14:41:40