android - 如何使用导航架构组件从 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);
}
解决方案
您的问题是您将requireActivity().getSupportFragmentManager()
其FragmentManager
用作适配器。
相反,您应该始终使用getChildFragmentManager()
完全包含在另一个片段中的片段 - 您会注意到,在配置更改或进程死亡和重新创建时,这是正确恢复每个片段的状态所必需的。
当您使用子 FragmentManager 时,requireParentFragment()
将返回您正在寻找的正确片段。
推荐阅读
- angular - 如何在 Angular 中制作通用解析器 (2+)
- r - 如何将 Circlize 和弦图另存为图形对象
- derived-column - Kingswaysoft记录更新:有没有办法添加一个变量,每次增加+1
- flutter - Flutter 布局问题
- sql - 找到一条记录,最后一条id_hash相同的记录,并在列中记录两条记录的时间差
- ruby-on-rails - 删除方法rails 6
- python - Python:替换多个正则表达式
- android - MaterialDatePicker 错误:要在您的应用主题中设置的 materialCalendarFullscreenTheme 属性
- processing - 如何在 p5 数据表中添加一行?
- excel - VBA 仅将第一列从 txt 文件中导入到 excel 中