首页 > 解决方案 > 如何使用导航架构组件从 ViewPager 页面片段访问主机片段

问题描述

我有一个想要迁移到Navigation Architecture Components的项目。

在迁移之前,我有一个活动,其中有一个片段,其中包含一个ViewPager; 我可以ViewPager通过引用我在片段事务中设置的主机片段标记从适配器片段访问此片段中的方法:

MyFragment fragment = (MyFragment ) ((MyActivity) requireActivity())
        .getSupportFragmentManager().findFragmentByTag("fragment_tag"); 
fragment.someMethodInMyFragment();

这是一个欺骗部分迁移的图表,以及我需要通过黄色箭头访问的内容:

在此处输入图像描述

在导航组件中,我没有机会为承载 的目标片段设置标签ViewPager,这样我就可以像以前一样通过标签访问它。此外,ViewPager适配器片段不是导航组件的一部分。

我尝试过的:ViewPager适配器片段中:

尝试 1

MyFragment fragment = (MyFragment) getParentFragment(); // This returns the navigation host fragment. So ClassCastException is raised
fragment.someMethodInMyFragment();

尝试 2

MyFragment fragment = (MyFragment) requireActivity().getSupportFragmentManager()
     .findFragmentById(R.id.myFragment); // id of myFragment in the nav graph.
fragment.someMethodInMyFragment(); // fragment is null

更新:

发布ViewPager适配器

public class PageFragmentPagerAdapter extends FragmentStatePagerAdapter {

    public PageFragmentPagerAdapter(FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return MyPagerFragment.newInstance(position);
    }


    @Override
    public int getCount() {
        return 10;
    }

}

我在MyFragment下面设置了 ViewPager

public class MyFragment extends Fragment {
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ViewPager viewPager = view.findViewById(R.id.viewpager);
        PageFragmentPagerAdapter adapter = new PageFragmentPagerAdapter(requireActivity()
                                                   .getSupportFragmentManager());
        viewPager.setAdapter(adapter);
    }

标签: androidandroid-fragmentsandroid-viewpagerandroid-navigation

解决方案


您的问题是您将requireActivity().getSupportFragmentManager()FragmentManager用作适配器。

相反,您应该始终使用getChildFragmentManager()完全包含在另一个片段中的片段 - 您会注意到,在配置更改或进程死亡和重新创建时,这是正确恢复每个片段的状态所必需的。

当您使用子 FragmentManager 时,requireParentFragment()将返回您正在寻找的正确片段。


推荐阅读