0

我已经实现了一个片段容器来更改我的选项卡中的片段。(请参阅:android,动态更改选项卡内的片段

我正在使用一个片段选项卡主机和一个框架布局(它在一个单独的活动中)将我的片段加载到其中。我的片段中有一个按钮正在变成另一个片段。我已经实现了该方法,并且解决了重叠片段问题。问题是,现在,每次我按下后退按钮时,我的应用程序都会退出(无论我的片段在哪里)。

我已经检查过我在提交之前是否tx.addToBackStack(curFrag.getClass().getSimpleName())尝试过tx.addBackStack(null),但仍然没有做任何事情。有人可以帮我吗?谢谢你。

编辑:

我已经在我的标签主机中添加了一个标签。这是我的 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,我应该调用我的方法?

4

2 回答 2

0

让我给你提示该怎么做:

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

一个主要活动 = TabActivity 在此活动中添加三个选项卡,例如: Tab 1 = FragmentActivity Tab 2 = FragmentActivity Tab 3 = FragmentActivity

选项卡 1 -> 不同的片段选项卡 2 -> 不同的片段选项卡 3 -> 不同的片段

等等 :

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

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

注意:严重的是,如果您正在考虑恢复旧的后台堆栈,那么它不会发生,因为它自己处理 FragmentActivity 的后台堆栈的操作系统..

于 2013-08-15T12:23:18.407 回答
0

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

Activecontainer 是我从 sharedpreferences 获得的字符串,已用片段名称标记。

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

于 2013-08-23T16:34:33.700 回答