分离后找不到FragmentbyTag

时间:2016-03-15 04:39:33

标签: android android-fragments

在onViewCreated()的MainFragment中,我尝试通过以下代码创建嵌套片段...

    FragmentManager fm = getChildFragmentManager();

    MainSubAFragment mainSubAFragment = MainSubAFragment.newInstance();
    MainSubBFragment mainSubBFragment = MainSubBFragment.newInstance();

    fm.beginTransaction()
            .add(R.id.contentContainer, mainSubAFragment, MainSubAFragment.class.getName())
            .add(R.id.contentContainer, mainSubBFragment, MainSubBFragment.class.getName())
            .detach(mainSubBFragment)
            .commit();

    if (fm.executePendingTransactions()) {
        showSubA();
    }

执行executePendingTransaction后,我调用showSubA(),但没有希望返回null ..

 public void showSubA() {
        FragmentManager fm = getChildFragmentManager();

        MainSubAFragment mainSubAFragment = (MainSubAFragment)
                fm.findFragmentByTag(MainSubAFragment.class.getName());
        MainSubBFragment mainSubBFragment = (MainSubBFragment)
                fm.findFragmentByTag(MainSubBFragment.class.getName());

        fm.beginTransaction()
                .attach(mainSubAFragment)
                .detach(mainSubBFragment)
                .commit();
    }

看起来分离是问题的原因??问题是..如果我调用detach我再也无法检索它了@ findFragmentByTag()??

  

项目示例:dropbox download

1 个答案:

答案 0 :(得分:0)

首先创建碎片。只要扩展了Fragment类,就可以在Fragment类中创建片段而不是原始类名。像这样。

Fragment mainSubAFragment, mainSubBFragment;

现在我们必须提供带有碎片的指针。

mainSubAFragment = new MainSubAFragment();< - 无需调用Object Class中的New Instance。 mainSubBFragment = new MainSubBFragment();

记住他们需要扩展到Fragment。我知道你做了。

现在我不知道为什么你必须得到ChildFragmentManager,但你可以直接获取FragmentManager;

FragmentManager fm = getFragmentManger();
FragmentTransaction ft = fm.beginTransaction();

现在一切准备就绪,我们转到执行部分。

        ft.add(R.id.contentContainer,mainSubAFragment,MainSubAFragment.class.getName());

    ft.add(R.id.contentContainer,mainSubBFragment,MainSubBFragment.class.getName());

       ft.commit();

注意:它们将堆叠在那里听众,就像普通片段一样。因此,除非在XML中声明不要在那里堆叠监听器,否则如果它们位于同一位置,则会调用onclick。

提交后添加此内容。

你需要添加另一个片段交易,为什么?因为您所做的Commit()可能无法完成,即使这是逐行执行。相信我,大多数时候堆栈呼叫都是相互争斗的。

为避免这种情况,

FragmentTransaction transaction2 = fm.beginTransaction();
fm.hide(MainSubBFragment.class.getName());

总结一下。

     Fragment mainSubAFragment, mainSubBFragment;

      FragmentManager fm = getFragmentManger();
      FragmentTransaction ft = fm.beginTransaction();
      FragmentTransaction transaction2;

      ft.add(R.id.contentContainer,mainSubAFragment,MainSubAFragment.class.getName());
ft.add(R.id.contentContainer,mainSubBFragment,MainSubBFragment.class.getName());

ft.commit();

     transaction2 = fm.beginTransaction();
    transaction2.hide(MainSubBFragment.class.getName());
    transaction2.commit();

确保Fragment Transactions和FragmentManagers是全局变量。因此,它们可以被其他方法使用,而不是创建新实例。