Ale*_*tov 357 android android-fragments android-viewpager fragmentpageradapter fragmentstatepageradapter
FragmentPagerAdapter
和之间有什么区别FragmentStatePagerAdapter
?
关于FragmentPagerAdapter
Google的指南说:
此版本的寻呼机最适合在有少量通常更多静态片段进行分页时使用,例如一组选项卡.用户访问的每个页面的片段将保留在内存中,但其视图层次结构可能在不可见时被销毁.这可能导致使用大量内存,因为片段实例可以保持任意数量的状态.对于较大的页面集,请考虑
FragmentStatePagerAdapter
.
关于FragmentStatePagerAdapter
:
当存在大量页面时,此版本的寻呼机更有用,更像列表视图.当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态.与
FragmentPagerAdapter
在页面之间切换时可能更多的开销相比,这允许寻呼机保持与每个被访问页面相关联的更少的存储器 .
所以我只有3个片段.但它们都是具有大量数据的独立模块.
Fragment1
处理一些数据(用户输入)并通过活动传递给它Fragment2
,这很简单ListFragment
.Fragment3
也是一个ListFragment
.
所以我的问题是:我应该使用哪种适配器?FragmentPagerAdapter
还是FragmentStatePagerAdapter
?
Emm*_*uel 285
就像文档说的那样,以这种方式思考.如果您要像书阅读器那样执行应用程序,则不希望一次将所有片段加载到内存中.您希望Fragments
在用户阅读时加载和销毁.在这种情况下,您将使用FragmentStatePagerAdapter
.如果您只是显示3个不包含大量重要数据的"标签"(例如Bitmaps
),那么FragmentPagerAdapter
可能适合您.另外,请记住,ViewPager
默认情况下会将3个片段加载到内存中.Adapter
你提到的第一个可能会破坏View
层次结构并在需要时重新加载它,第二个Adapter
只保存状态Fragment
并完全销毁它,如果用户然后返回到该页面,则检索状态.
Luf*_*ffy 125
FragmentPagerAdapter
将整个片段存储在内存中,如果使用大量片段,可能会增加内存开销
ViewPager
.
相反,它的兄弟FragmentStatePagerAdapter
只存储片段的savedInstanceState,并在失去焦点时销毁所有片段.
因此,FragmentStatePagerAdapter
当我们必须使用动态片段(如带有小部件的片段)时,应该使用它们,因为它们的数据可以存储在savedInstanceState
.中.即使存在大量片段,它也不会影响性能.
相反,FragmentPagerAdapter
当我们需要将整个片段存储在内存中时,应该使用它的兄弟.
当我说整个片段保存在内存中意味着,它的实例不会被破坏并且会产生内存开销.因此建议FragmentPagerAdapter
仅在片段数量较少时使用ViewPager
.
如果片段是静态的,那将会更好,因为它们不会有大量的实例存储的对象.
更详细一点,
FragmentStatePagerAdapter:
with FragmentStatePagerAdapter
,您的不需要的片段被销毁.一个事务被提交以从您的活动中完全删除该片段FragmentManager
.
状态FragmentStatePagerAdapter
来自这样一个事实:它会在你的片段被销毁时将其保存下来Bundle
.savedInstanceState
当用户导航回来时,新片段将使用片段的状态进行恢复.
FragmentPagerAdapter:
通过比较FragmentPagerAdapter
没有做任何事情.当片段不再需要时.FragmentPagerAdapter
调用
detach(Fragment)
事务而不是remove(Fragment)
.
这破坏了片段的视图,但是片段的实例仍然存在于FragmentManager
.so中创建的片段
FragmentPagerAdapter
永远不会被破坏.
Pha*_*inh 41
这是每个片段的日志生命周期,ViewPager
其中有4个片段和offscreenPageLimit = 1 (default value)
FragmentStatePagerAdapter
转到Fragment1(启动活动)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
Run Code Online (Sandbox Code Playgroud)
转到Fragment2
Fragment3: onCreateView
Fragment3: onStart
Run Code Online (Sandbox Code Playgroud)
转到Fragment3
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart
Run Code Online (Sandbox Code Playgroud)
转到Fragment4
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Run Code Online (Sandbox Code Playgroud)
FragmentPagerAdapter
转到Fragment1(启动活动)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
Run Code Online (Sandbox Code Playgroud)
转到Fragment2
Fragment3: onCreateView
Fragment3: onStart
Run Code Online (Sandbox Code Playgroud)
转到Fragment3
Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart
Run Code Online (Sandbox Code Playgroud)
转到Fragment4
Fragment2: onStop
Fragment2: onDestroyView
Run Code Online (Sandbox Code Playgroud)
结论:当片段被克服时FragmentStatePagerAdapter
调用而不是. onDestroy
offscreenPageLimit
FragmentPagerAdapter
注:我觉得应该用FragmentStatePagerAdapter
的ViewPager
,因为它会很好的表现,其有很多页.
示例的offscreenPageLimit
:
如果我们去Fragment3,它会破坏Fragment1(或Fragment5,如果有)因为offscreenPageLimit = 1
.如果我们设置offscreenPageLimit > 1
它不会破坏.
如果在这个例子中,我们设置offscreenPageLimit=4
,使用之间没有区别,FragmentStatePagerAdapter
或者FragmentPagerAdapter
因为Fragment从不调用onDestroyView
和onDestroy
我们更改选项卡
JDe*_*ais 37
在文档或本页面的答案中没有明确说明的内容(即使@Naruto暗示),FragmentPagerAdapter
如果Fragment中的数据发生变化,则不会更新Fragments,因为它会将Fragment保留在内存中.
因此,即使您要显示有限数量的片段,如果您希望能够刷新片段(例如,重新运行查询以更新片段中的listView),则需要使用FragmentStatePagerAdapter.
我的全部观点是碎片的数量以及它们是否相似并不总是需要考虑的关键方面.您的碎片是否是动态的也是关键.
归档时间: |
|
查看次数: |
108467 次 |
最近记录: |