回到片段和嵌套片段

时间:2016-10-21 15:55:34

标签: android android-fragments android-nested-fragment

我有这样的应用

一项活动及其内部>

  1. 片段a(当从菜单中运行应用程序时可以打开它)
  2. 片段b(从菜单中打开)
  3. 片段c(可以从片段a打开它,也可以从菜单中打开它)
  4. 在片段c内也有4个子片段

    在主要活动中(使用导航抽屉作为源)我在这样的oncreate中调用片段a

     FragmentManager fragmentManager=getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.fragment_place,new First_Fragment()).addToBackStack("First").commit();
    

    我的问题是如何控制后退按钮以始终返回片段a并且当片段a打开关闭app时 我正在使用addToBackStack(null)但不是我想要的,因为它将显示我打开的片段的所有历史记录

2 个答案:

答案 0 :(得分:1)

将片段a添加到后台堆栈时,“addToBackStack(String name)”会传入一个名称。

然后听取片段中的背压

FragmentManager fm = getFragmentManager();
fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
    }
});

确保在每个片段未显示时停止侦听。

然后你可以弹回添加到后栈的命名片段

    FragmentManager fm = getActivity()
            .getSupportFragmentManager();
    fm.popBackStack ("name", FragmentManager.POP_BACK_STACK_INCLUSIVE);

确保未将其余的片段事务添加到后台堆栈。这应该会给你你想要的行为。

答案 1 :(得分:1)

addToBackStack(String tag)用于将片段添加到backstack,它包含字符串作为参数。此参数可以为null或具有某个值。 如果您传递null,它会将您的片段添加到带有 null 标记的Backstack中。 addToBackStack(null)并不意味着您的片段未添加到backstack。
如果您希望您的片段不会被添加到backstack,那么只需删除此行。

如果要将片段添加到backstack并希望它可见onBackPressed,那么您可以使用

getSupportFragmentManager().popBackStackImmediate(/* Fragment TAG */,0);

代码: - 请尝试以下代码并告知我们。

  1. 复制主活动中的以下功能。

    /**
     * function to show the fragment
     *
     * @param name fragment to be shown
     * @param tag  fragment tag
     */
     public void showFragment(Fragment name, String tag) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        // check if the fragment is in back stack
        boolean fragmentPopped = fragmentManager.popBackStackImmediate(tag, 0);
        if (fragmentPopped) {
           // fragment is pop from backStack
        } else {
           FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
           fragmentTransaction.replace(R.id.fragment_container, name, tag);
           fragmentTransaction.addToBackStack(tag);
           fragmentTransaction.commit();
        }}
    
  2. 使用以下代码显示片段。

    showFragment(yourFragment, yourFragmentTag);

  3. 在mainActivity onBackPressed。

    @override public void onBackPressed(){ FragmentTransaction fts = getSupportFragmentManager().beginTransaction(); FragmentManager fragmentManager = getSupportFragmentManager(); if (fragmentManager.getBackStackEntryCount() >= 2) { // always show your fragment a here showFragment(new FragmentA(), FragmentA.class.getSimpleName()); } else { // finish your activity } }