使用嵌套片段管理后退按钮

时间:2013-04-29 18:30:25

标签: android android-fragments

我有一个MainActivitycontent_container加载Fragments

其中一个Fragment我还有一个sub_container来加载Fragments

MainActivity i管理后退按钮,堆栈为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();
        }
    }
}

每当我想替换Fragment中的content_container时,我都会使用

Fragment someFragment = new SomeFragment(); 
fragmentTransaction.replace(R.id.content_container, ((MainActivity)getActivity()).addFragmentToStack(someFragment), "");
fragmentTransaction.commit();

一个Fragment是一个图库,其中包含一个加载photosvideos Fragment的菜单(因此图库是父Fragment照片和视频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

例如,当我从视频转到照片库时,按下后面ButtonMainActivity的{​​{1}}中的代码将被执行,而当前{{ 1}}实例被堆栈中的实例替换,但其onBackPressed为空(不调用GalleryFragmentsub_container)。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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);