如何向 ViewPager 提供许多片段并避免错误代码?

Posted

技术标签:

【中文标题】如何向 ViewPager 提供许多片段并避免错误代码?【英文标题】:How do I supply many Fragments to ViewPager and avoid bad code? 【发布时间】:2011-11-06 17:52:39 【问题描述】:

我有 20 个 FragmentActivity,它们都代表着不同机制的游戏画面。 我想把它们都放在 ViewPager 中。唯一想到的是这个虚拟代码:

 public static class MyAdapter extends FragmentPagerAdapter 


    @Override
    public Fragment getItem(int position) 
        switch(position)
          case 0:
            return new Fragment1();
          case 1:
            return new Fragment2();
          .........................
          another 20 case statements here
          .........................
          case 20:
            return new Fragment21();
        
    

 

但是应该有另一种方法来做到这一点。将不胜感激任何帮助。

【问题讨论】:

【参考方案1】:

FragmentPagerAdapter 足够聪明,不会在每次需要时都实例化片段。所以你的代码是好的。也就是说,保存在内存中的 20 个片段可能有点太多了。看看FragmentStatePagerAdapter,它会自动保存和恢复片段,而不是一直在内存中。

除了使用switch,您还可以拥有一个片段列表并从列表中返回:

List<Fragment> fragments;

public Fragment getItem(int pos) 
  return fragments.get(pos);


public void addFragment(Fragment f) 
  fragments.add(f);

【讨论】:

那个代码看起来很丑。我试图重新考虑 Api 演示中用于午餐活动的内容,但失败了。 哦,如果您担心,只需将它们添加到列表中即可。查看更新的答案。 这看起来像是将那几行代码移到另一个地方。我将在主 Activity 中调用 addFragment 20 次。如果你说这是多屏游戏的常见做法,我会很满意:) 如果你必须实例化 20 个不同的类,你必须在某个地方做。如果你有一个类名列表,你可以使用反射并在循环中执行它,如果这让你感觉更好。关键是您实际上是通过使用查找表(列表)来避免分支(切换)。我不玩游戏,顺便说一句:) 将名称/页面标题与该列表中的每个片段相关联的好方法是什么?【参考方案2】:

使用FragmentStatePagerAdapter 代替FragmentPagerAdapter

FragmentStatePagerAdapter 使用ArrayList 存储片段,但FragmentPagerAdapter 使用getFragmentByTag

【讨论】:

【参考方案3】:

老实说,我不认为这有什么问题,你会在很多游戏中看到类似的东西,比如菜单、游戏、暂停、游戏结束等屏幕。

不过我想说的是,每次切换到不同的页面时,您是否真的需要创建一个“新”片段。

【讨论】:

据我所知,FragmentPagerAdapter 只有在我的项目尚未创建时才会创建新实例。如您所见,所有 Fragment 都是不同的类,所以我需要 20 个或其他任何 switch 语句,这对我来说看起来很丑。

以上是关于如何向 ViewPager 提供许多片段并避免错误代码?的主要内容,如果未能解决你的问题,请参考以下文章

转到ViewPager中的下一页

从选项卡式片段导航时,如何避免聚焦最后一个 EditText?

如何知道片段何时在 viewpager 中实际可见

如何使用 tabLayout 在 ViewPager 中显示片段?

如何以编程方式从片段内部设置ViewPager选项卡?

viewpager 中的片段,未找到视图错误