max-whdth和min-whdth有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了max-whdth和min-whdth有啥区别?相关的知识,希望对你有一定的参考价值。
max-width和min-width分别限定元素的最大和最小宽度。两者可以单独使用,也可以结合width使用,或者三者一起使用。
当元素宽度不确定时,单独使用max-width可以防止元素超过最大的宽度值而造成样式错乱;单独使用min-width可以防止元素过小造成文字重叠等情况。 参考技术A max-width是这个元素最宽是多少。假如max-width的值是1200,浏览器的宽度是1500,那么具有max-width样式的元素旁边就会留白300px。
min-width就最小宽度。假如width是100%,min-width是1200,浏览器的宽度是800那个浏览器底部会出现滚动条,以保证元素的最小宽度。 参考技术B max-width:最大宽度,例如:width:30%;max-width:200px;元素的宽度的取值范围为,占有父元素宽度的百分之三十,但是最宽不得超过200px
min-width:最小宽度。min-width:30%;min-width:200px同上,元素的最小宽度为200px
width:宽度 参考技术C 一个规定最大宽度,一个规定最小宽度
FragmentPagerAdapter 和 FragmentStatePagerAdapter 有啥区别?
【中文标题】FragmentPagerAdapter 和 FragmentStatePagerAdapter 有啥区别?【英文标题】:What is the difference between FragmentPagerAdapter and FragmentStatePagerAdapter?FragmentPagerAdapter 和 FragmentStatePagerAdapter 有什么区别? 【发布时间】:2013-09-15 21:04:40 【问题描述】:FragmentPagerAdapter
和 FragmentStatePagerAdapter
有什么区别?
关于FragmentPagerAdapter
Google 的指南说:
这个版本的寻呼机最适合在有少数人的情况下使用 通常需要分页的更多静态片段,例如一组 标签。用户访问的每个页面的片段将保存在 内存,尽管它的视图层次结构在不可见时可能会被破坏。 这可能会导致使用大量内存,因为片段 实例可以保持任意数量的状态。对于较大的套装 页数,请考虑
FragmentStatePagerAdapter
。
关于FragmentStatePagerAdapter
:
这个版本的寻呼机在人多的时候比较有用 页面,更像是一个列表视图。当页面不可见时 用户,他们的整个片段可能会被销毁,只保留 该片段的保存状态。这允许寻呼机保持很多 与每个访问的页面相关的内存更少
FragmentPagerAdapter
以潜在的更多开销为代价 在页面之间切换。
所以我只有 3 个片段。但它们都是独立的模块,数据量很大。
Fragment1
处理一些数据(用户输入)并通过活动将其传递给Fragment2
,这只是一个简单的ListFragment
。 Fragment3
也是 ListFragment
。
所以我的问题是:我应该使用哪个适配器? FragmentPagerAdapter
或 FragmentStatePagerAdapter
?
【问题讨论】:
我认为只有 3 个 Fragment 使您有资格使用 FragmentPagerAdapter。这些 Fragments 的选项卡可能会同时显示。 这篇文章节省了我 5-6 个小时,因为我使用了错误类型的适配器 回答这个问题会引发另一个问题***.com/questions/9156406/… 有FragmentPagerAdapter
和FragmentStatePagerAdapter
但FragmentStateAdapter
是什么?
【参考方案1】:
就像文档说的那样,这样想吧。如果你要做一个像阅读器这样的应用程序,你不会希望一次将所有片段加载到内存中。您想在用户阅读时加载和销毁Fragments
。在这种情况下,您将使用FragmentStatePagerAdapter
。如果您只显示 3 个不包含大量数据的“标签”(例如 Bitmaps
),那么 FragmentPagerAdapter
可能很适合您。另外,请记住 ViewPager
默认情况下会将 3 个片段加载到内存中。您提到的第一个Adapter
可能会破坏View
层次结构并在需要时重新加载它,第二个Adapter
仅保存Fragment
的状态并完全破坏它,如果用户随后返回该页面,则状态被检索。
【讨论】:
我在 Fragment1 和 ListView 中有多个 Button 和 TextView,它们在 Fragment2 和 Fragment3 中动态生成项目。您认为使用 FragmentStatePagerAdapter 并将所有数据存储在 Activity 中,通过 Bundle 将其传递给 Fragments 是一个好主意吗? @AlexMomotov Fragment 布局中的视图与 FragmentStatePagerAdapter 的选择没有任何关系。这里的问题是分页的 Fragment 数量。 所以基本上没有什么赞成FragmentPagerAdapter
使用它。
@Tomasz FragmentPagerAdapter
的优势在于片段之间的切换可以更快,因为实际的Fragment
对象不需要每次都重新构建。另一方面,这最终会使用更多的内存来保存内存中的片段对象。
我有 3 个标签/页面(每个都显示一个 WebView),所以使用了 FragmentPagerAdapter。但是,当我从第一页滑到最后一页时,最后一页仍然会被重绘。为了解决这个问题,我使用了viewPager.setOffscreenPageLimit(2)
。【参考方案2】:
FragmentStatePagerAdapter:
使用FragmentStatePagerAdapter
,您不需要的片段是
已销毁。事务已提交以完全删除
来自您活动的FragmentManager
的片段。
FragmentStatePagerAdapter
中的状态来自于它
将从savedInstanceState
中保存您片段的Bundle
时
它被破坏了。当用户导航回来时,新的片段将是
使用片段的状态恢复。
FragmentPagerAdapter:
相比之下,FragmentPagerAdapter
没有做任何此类事情。当
不再需要该片段。FragmentPagerAdapter
调用
事务上的detach(Fragment)
而不是remove(Fragment)
。
这破坏了片段的视图,但留下了片段的实例
活在FragmentManager
.so 中创建的片段
FragmentPagerAdapter
永远不会被破坏。
【讨论】:
为什么你有 2 个答案? 将整个片段保存在内存中有什么好处? @Tomek :如果下一个片段已经实例化(即 FragmentPagerAdapter),当您滑动到它时,它将准备好渲染,因此滑动动画会更流畅。使用 FragmentStatePagerAdapter,下一个 Fragment 实例可能在您滑动到它之前不存在,如果它是一个创建成本很高的大 Fragment,您可能会在动画中看到卡顿。这是性能与内存消耗的问题。 @Jared Burrows bcoz 一个是 AnswerText,它适用于小的静态答案,另一个是 AnswerStateText,适用于更大和动态的答案【参考方案3】:这是ViewPager
中每个片段的日志生命周期,其中有4个片段和offscreenPageLimit = 1 (default value)
FragmentStatePagerAdapter
转到 Fragment1(启动活动)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
转到 Fragment2
Fragment3: onCreateView
Fragment3: onStart
转到片段3
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart
转到 Fragment4
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
FragmentPagerAdapter
转到 Fragment1(启动活动)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
转到 Fragment2
Fragment3: onCreateView
Fragment3: onStart
转到片段3
Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart
转到 Fragment4
Fragment2: onStop
Fragment2: onDestroyView
结论:当 Fragment 被克服时FragmentStatePagerAdapter
调用onDestroy
offscreenPageLimit
而FragmentPagerAdapter
不是。
注意:我认为我们应该将FragmentStatePagerAdapter
用于具有大量页面的ViewPager
,因为它有利于性能。
示例 offscreenPageLimit
:
如果我们转到 Fragment3,它将销毁 Fragment1(或 Fragment5,如果有的话),因为 offscreenPageLimit = 1
。如果我们设置 offscreenPageLimit > 1
它不会销毁。
如果在这个例子中,我们设置offscreenPageLimit=4
,那么使用FragmentStatePagerAdapter
或FragmentPagerAdapter
没有区别,因为Fragment永远不会在我们改变标签时调用onDestroyView
和onDestroy
Github demo here
【讨论】:
这样一个很棒的结论! 很好的解释 很好的解释。您说在有很多页面时使用 FragmentStatePagerAdapter 对性能有好处。你的意思是它对节省内存有好处吗?据我了解,目标是在可能有许多 Fragment 实例的情况下保留内存 - 所以性能是隐含的好处;明确的目标是保留记忆【参考方案4】:文档或此页面上的答案中未明确说明的内容(即使@Naruto 暗示)是,如果片段中的数据发生更改,FragmentPagerAdapter
将不会更新片段,因为它保留了片段在内存中。
因此,即使您要显示的 Fragment 数量有限,如果您希望能够刷新您的 Fragment(例如,您重新运行查询以更新 Fragment 中的 listView),您需要使用 FragmentStatePagerAdapter .
我在这里的全部观点是,片段的数量以及它们是否相似并不总是需要考虑的关键方面。您的片段是否是动态的也是关键。
【讨论】:
假设我有 2 个片段,片段 A 中有 1 个 recyclerview,当我单击一个项目时,它会更改片段 B 的内容,比如说我执行 fragB.setText("blablabla")。我应该使用状态寻呼机吗? 不确定,但我会说是的。两者都试一下,无论如何,将您的代码从一个更改为另一个非常简单快捷。 @JDenais 你确定这是正确的吗?我在我的活动中使用FragmentPagerAdapter
,它使用 ViewPager 来显示两个片段 - 每个片段都包含一个列表。我的第一个列表称为“所有报告”,第二个列表是“最喜欢的报告”。在第一个列表中,如果我点击报告的星形图标,它会更新数据库以切换该报告的收藏状态。然后我扫过,我成功地在第二个列表的 UI 中看到了这个报告。所以也许这些实例被保存在内存中,但在某些情况下(例如,我的),内容实际上会为 FragmentPagerAdapter 更新正常【参考方案5】:
FragmentPagerAdapter
存储从适配器获取的先前数据,而FragmentStatePagerAdapter
每次执行时都从适配器获取新值。
【讨论】:
【参考方案6】:FragmentStatePagerAdapter = 在 ViewPager 中容纳大量片段。由于此适配器在用户看不到片段时将其销毁,并且仅保留片段的 savedInstanceState 以供进一步使用。这种方式使用的内存量较少,并且在动态片段的情况下提供了更好的性能。
【讨论】:
【参考方案7】:FragmentPagerAdapter:用户访问的每个页面的fragment都会存储在内存中,虽然视图会被销毁。因此,当页面再次可见时,将重新创建视图,但不会重新创建片段实例。这可能会导致使用大量内存。当我们需要将整个片段存储在内存中时,应该使用 FragmentPagerAdapter。 FragmentPagerAdapter 在事务上调用 detach(Fragment) 而不是 remove(Fragment)。
FragmentStatePagerAdapter:片段实例在对用户不可见时被销毁,片段的保存状态除外。这导致仅使用少量内存,并且可用于处理更大的数据集。当我们必须使用动态片段时应该使用,例如带有小部件的片段,因为它们的数据可以存储在savedInstanceState中。而且即使有大量片段也不会影响性能。
【讨论】:
【参考方案8】:根据文档:
管理每个片段的生命周期的标准 PagerAdapter 有两种类型:FragmentPagerAdapter 和 FragmentStatePagerAdapter。它们都适用于片段,但它们更适合不同的场景:
只要用户可以在片段之间导航,FragmentPagerAdapter 就会将片段存储在内存中。当片段不可见时,PagerAdapter 将分离它,但不会销毁它,因此片段实例在 FragmentManager 中保持活动状态。只有当 Activity 关闭时,它才会从内存中释放它。这可以使页面之间的过渡快速而流畅,但如果您需要很多片段,它可能会导致您的应用出现内存问题。
FragmentStatePagerAdapter 确保销毁用户看不到的所有 Fragment,并仅将其保存的状态保留在 FragmentManager 中,因此得名。当用户导航回片段时,它将使用保存的状态恢复它。这个 PagerAdapter 需要的内存要少得多,但是页面之间的切换过程会比较慢。
【讨论】:
以上是关于max-whdth和min-whdth有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章