如何向 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 提供许多片段并避免错误代码?的主要内容,如果未能解决你的问题,请参考以下文章
从选项卡式片段导航时,如何避免聚焦最后一个 EditText?