getSupportFragmentManager与getChildFragmentManager的区别

9

我希望在活动中创建片段。 我在一个活动中有4个片段。 我有这样的代码

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new fragment_invoice(), "Invoice");
    adapter.addFragment(new fragment_sales_order(), "Sales Order");
    adapter.addFragment(new fragment_achievement(), "Achievement");
    adapter.addFragment(new fragment_approval(), "Approval");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList      = new ArrayList<>();
    private final List<String> mFragmentTitleList   = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }

}

我已经成功地展示了碎片,但是当我打开其他的碎片时,例如:

  1. 打开 fragment_invoice
  2. 移动到 fragment_achievement
  3. 我回到 fragment_invoice,然后所有的数据都会丢失,但在 fragment_sales_order 中不会。
  4. 如果我打开 fragment_sales_order,那么也会发生同样的情况,移动到 fragment_approval,然后 fragment_sales_order 中的所有数据都会丢失。

为什么奇偶数碎片中的数据会丢失呢?

我研究过这个问题,可能可以给我一些使用 getchildfragmentmanager 的想法。 getChildFragmentManager () 无法解析或无法引用

对于 getchildfragmentmanager 方法,必须扩展 FragmentManager,但我的 java 类必须扩展 AppCompatActivity。无法扩展 FragmentManager,因为有些数据是从 http 中获取的,而通过 activity intent 扩展。

有人能帮我修复我的碎片,使得在移动到其他碎片时始终显示数据吗? 如果我的问题和语法很奇怪,请多多包涵。

1个回答

19

getChildFragmentManager()的定义是:

返回一个私有的FragmentManager,用于在Fragment内部放置和管理Fragment。

而getFragmentManager()的定义则是:

返回与Fragment所属活动相关联的FragmentManager,以便与Fragment进行交互。

基本上,它们的区别在于现在Fragment有了自己的内部FragmentManager来处理Fragment。子FragmentManager处理仅包含在其所添加到的Fragment中的Fragment。另一个FragmentManager则包含在整个Activity中。

要在MainActivity上显示Fragment1,我们必须使用getSupportFragmentManager()

getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());

要在Fragment1中显示Fragment2,我们有两种方法

使用getFragmentManager()

getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());

使用 getChildFragmentManager()

首先,在 fragment1.xml 中创建一个带有 id 为 container_view_on_fragment1 的布局,然后

getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();

1
你可以给我一些源代码示例吗? - hoon1
我可以使用addFragment()方法吗? 也许可以给一些关于addFragment()的示例代码。 - hoon1
也许addfragment()方法是由某个人编写的自定义方法,用于添加片段,它并不在Android框架中。 - Rohit Sharma
哦,好的,对不起。 我已经发布了那个方法。 你能给我一个例子吗? - hoon1
请将以下与编程有关的内容从英语翻译成中文。 仅返回已翻译的文本:如果您喜欢我的工作,请接受答案。 - Rohit Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接