片段容器不保留addBackStack android

时间:2013-08-15 11:51:14

标签: android fragment

我已经实现了一个片段容器来更改标签内的片段。 (见:android, dynamically change a fragment inside a tab

我正在使用片段标签主机和framelayout(它在一个单独的活动上)将片段加载到其中。我的片段中有一个按钮正在转换为另一个片段。我已经实现了该方法,并解决了重叠片段问题。事情是,现在,每次按下后退按钮,我的应用程序都会退出(无论我的片段在哪里)。

我已经检查过,在提交之前,tx.addToBackStack(curFrag.getClass().getSimpleName())甚至尝试使用tx.addBackStack(null),但仍然没有做任何事情。谁能帮助我?谢谢。

编辑:

我已经在我的tabhost中添加了一个标签。 这是我的FragmentTabMenu.java

setContentView(R.layout.activity_fragment_tab_menu);
        Resources res = getResources();


        mtabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); //id from the activity that hosts the tabwidget
           mtabHost.setup(this, getSupportFragmentManager(), R.id.FrameLayout1); //id from the other activity that only hosts the framelayout

           //passing the class that my container will execute on the onResume method 

           Bundle args1=new Bundle();              
           args1.putSerializable(PARAM_CONTENT_FRAGMENT,RegistoUtilizador.class); 

           //creating the tab
           mtabHost.addTab(
                    mtabHost.newTabSpec("RegistoUti").setIndicator("Tab 1",
                            res.getDrawable(R.drawable.tab_icon_rui)),
                    ContentorFragRegistoUti.class, args1);

这是我的容器类

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

   return inflater.inflate(R.layout.frag_container, null);
}

public void replaceContent(Class<? extends Fragment> clz, Bundle args) {
    FragmentTransaction tx = getChildFragmentManager().beginTransaction();

    tx.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    // save
    Fragment curFrag = getChildFragmentManager().findFragmentById(R.id.FrameLayout1);
    tx.addToBackStack(curFrag.getClass().getSimpleName());

    // change
    try {

        Fragment newFragment = clz.newInstance();
        newFragment.setArguments(args);
        tx.replace(R.id.FrameLayout1, newFragment, clz.getClass().getSimpleName());

        tx.commit();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

}

@Override
public void onResume() {
    super.onResume();
    Fragment f = getChildFragmentManager().findFragmentById(R.id.FrameLayout1);
    if (f == null) {
        Class<? extends Fragment> claz = (Class<? extends Fragment>) getArguments().getSerializable(
                PARAM_CONTENT_FRAGMENT);

      FragmentTransaction tx = getChildFragmentManager().beginTransaction();
        try {
            f = claz.newInstance();
            f.setTargetFragment(this, 0);
            tx.add(R.id.FrameLayout1, f);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}

也许我错过了什么Framelayout id,我应该调用我的方法?

2 个答案:

答案 0 :(得分:0)

让我给你一些提示:

假设整个应用程序中有3个选项卡:

一个主要活动= TabActivity 在此活动中添加三个选项卡 喜欢 : 标签1 = FragmentActivity 标签2 = FragmentActivity 标签3 = FragmentActivity

标签1 - &gt;不同的碎片 标签2 - &gt;不同的碎片 标签3 - &gt;不同的碎片

等等:

在每个片段中保存您的偏好

然后,在第二次启动应用程序时,您知道之前选择了哪个选项卡,因此触发了FragmentActivity的意图,现在您在该选项卡中然后触发该活动中受尊重的片段..

注意:说真的,如果你想恢复旧的后台堆栈,那么它就不会发生,因为它自己处理了FragmentActivity的后台堆栈。

答案 1 :(得分:0)

好的,第一部分完成了。我调用容器并使用以下方法加载它:mtabHost.setCurrentTabByTag(“Activecontainer”);

Activecontainer是我从sharedpreferences得到的字符串已被片段名称标记。

现在我只需要设置片段。有什么建议吗? 谢谢。