Tab Layout不显示Fragment问题:父Fragment内嵌TabLayout时子Fragment不可见
问题原因
你的子Fragment无法显示是FragmentPagerAdapter的getCount()方法返回值错误导致的,同时还存在其他几个适配逻辑问题:
FragmentAdapter的getCount()方法硬编码返回0,ViewPager会认为没有需要加载的Fragment,自然不会渲染任何内容- 构造FragmentAdapter时混淆了第二个参数的含义:
FragmentPagerAdapter构造的第二个参数是行为模式常量(比如BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT),你错误把Tab数量传进去赋值给了tabcount - 切换Tab时不需要每次都调用
notifyDataSetChanged(),会造成不必要的Fragment重建,影响性能
修复方案
1. 修复FragmentAdapter代码
public class FragmentAdapter extends FragmentPagerAdapter { int tabcount; // 构造方法修改:第二个参数传Tab数量,行为模式直接在父类构造传标准常量 public FragmentAdapter(@NonNull @NotNull FragmentManager fm, int tabCount) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); this.tabcount = tabCount; } @NonNull @NotNull @Override public Fragment getItem(int position) { switch (position){ case 0: return new WatchingFragment(); case 1: return new CompletedFragment(); case 2: return new WantToWatchFragment(); default: return new WatchingFragment(); // 不要返回null,避免崩溃 } } @Override public int getCount() { return tabcount; // 返回实际Tab数量,不要返回0 } }
2. 优化NotificationsFragment的Tab切换逻辑
删除onTabSelected里多余的notifyDataSetChanged()调用:
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { vp.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } });
3. 补充WatchingFragment的空判断(可选,避免崩溃)
你当前直接把Intent拿到的animename添加到列表,如果跳转时没有传这个参数会添加null,建议增加判断:
String animename = intent.getStringExtra("nameanime"); if (animename != null && !animename.isEmpty()) { list.add(animename); }
修改完成后重新运行即可正常显示子Fragment。
内容的提问来源于stack exchange,提问作者TheVishesh Vlog
相关产品推荐
相关产品推荐

