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

     2023-04-14     152

关键词:

【中文标题】如何向 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 语句,这对我来说看起来很丑。

1000多个项目中的十大javascript错误以及如何避免(代码片段)

...错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。对于这些错误发生的次数,我们是通过收集的数据统计得出的。Rollbar 会收集每个项目中的所有错误,并总结每个错误发生的次数,然后通过各个错误的特征... 查看详情

如何避免前向声明错误?

】如何避免前向声明错误?【英文标题】:HowcanIavoidforwarddeclarationerror?【发布时间】:2017-11-0404:37:51【问题描述】:我在C++中得到了以下代码:classLevel;classNodecharletter;std::stringpath[2];Node*next;Level*nlevel;public:Node()path[0]="";path[1]="";nex... 查看详情

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

...Fragment?【发布时间】:2014-11-0523:25:29【问题描述】:我在ViewPager中有3个选项卡。默认情况下,选项卡2中的焦点位于第一个EditText中。当我从Tab2导航到Tab3并返回时,我发现焦点位于Tab2的 查看详情

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

】如何知道片段何时在viewpager中实际可见【英文标题】:Howtoknowwhenfragmentactuallyvisibleinviewpager【发布时间】:2018-07-3106:32:59【问题描述】:我在ViewPager中使用了4个片段,因为ViewPager会提前加载上一个和下一个片段,并且在片段之... 查看详情

viewpager的使用

  在许多APP中经常会看到许多图片的滑动显示,是使用ViewPager的使用,我做了一个小Demo实现它的应用,有什么的不对希望读者留评论指正。示意图如下通过滑动图片,小红点也随着移动。首先先找几个图片作为显示:将图片... 查看详情

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

】如何使用tabLayout在ViewPager中显示片段?【英文标题】:HowtoshowfragmentsinViewPagerwithtabLayout?【发布时间】:2020-12-1108:10:01【问题描述】:我正在尝试使用tabsLayout在vi​​ewPager中显示片段,但viewPager什么也没显示。但是,选项卡已... 查看详情

如何避免向表中添加时间戳字段? [关闭]

】如何避免向表中添加时间戳字段?[关闭]【英文标题】:Howdoyouavoidaddingtimestampfieldstoyourtables?[closed]【发布时间】:2010-09-1408:58:44【问题描述】:我有一个关于我们在许多解决方案中看到的每条记录的两个附加列(timeCreated、time... 查看详情

如何避免许多#ifdef 记录语句

】如何避免许多#ifdef记录语句【英文标题】:howtoavoidmany#ifdefforloggingstatements【发布时间】:2013-10-3116:50:41【问题描述】:在我们的应用程序中,我们创建了自己的日志系统。在这个日志系统中有几种不同的日志类型,调试、错... 查看详情

高并发下如何避免产生重复数据?(代码片段)

前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1.需求产品有个需求:用户选择一些品牌࿰... 查看详情

高并发下如何避免产生重复数据?(代码片段)

前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1.需求产品有个需求:用户选择一些品牌࿰... 查看详情

javascript选择器操纵并向用户界面提供数据(代码片段)

查看详情

遵循pep8风格指南(代码片段)

Python增强建议#8,也称为PEP8,是关于如何格式化Python代码的样式指南。你可以使用任何你想要的方式编写Python代码,只要它有有效的语法。但是,使用一致的格式化代码更易于阅读。在更大的社区中,与其他Python程序员共享一种... 查看详情

如何使用 viewpager 和片段为我的 ListView 设置适配器

】如何使用viewpager和片段为我的ListView设置适配器【英文标题】:HowtosetanadaptertomyListViewwithaviewpagerandfragment【发布时间】:2016-11-2117:32:55【问题描述】:我的代码中出现以下错误:FATALEXCEPTION:mainProcess:com.herprogramacin.hermosaprogramacio... 查看详情

python日志记录:如何向logrecord添加自定义字段,并注册全局回调以设置其值(代码片段)

在Flask应用程序中,每当user_id中存在user_id时,我想添加一个flask.session字段添加到生成的每个错误日志记录中。我想出了下面的解决方案,但它是hackish,因为它不允许格式字符串驱动user_id的格式,并且因为日志记录API似乎提供... 查看详情

如何避免嵌套事务不支持错误?

】如何避免嵌套事务不支持错误?【英文标题】:Howtoavoidnestedtransactionsnotsupportederror?【发布时间】:2013-07-0907:11:07【问题描述】:我需要确保许多并发用户能够访问数据库。虽然每次提交后我都会关闭会话,但有时我的代码会... 查看详情

BottomNavigationView - 如何避免重新创建片段并重用它们

】BottomNavigationView-如何避免重新创建片段并重用它们【英文标题】:BottomNavigationView-HowtoavoidrecreationofFragmentsandreusethem【发布时间】:2017-12-2104:37:24【问题描述】:我想在我的项目中制作一个底部导航栏。每个视图都有它自己的... 查看详情

如何避免在互斥锁上锁定许多线程,这些线程由休眠的线程锁定(拥有)?

】如何避免在互斥锁上锁定许多线程,这些线程由休眠的线程锁定(拥有)?【英文标题】:HowcanIavoidlockofmanythreadsonmutexwhichlocked(owned)bythreadwhichsleep?【发布时间】:2016-07-0119:19:33【问题描述】:这个问题被称为Convoying:如果一... 查看详情

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

】viewpager中的片段,未找到视图错误【英文标题】:fragmentsinviewpager,noviewfounderror【发布时间】:2015-05-0516:07:03【问题描述】:我有一个活动持有一个片段,在这个片段中有一个按钮,当它被点击时,会弹出一个对话框。在这个... 查看详情