Fragment的概念:
- Fragments必须放在一个Activity中
- Fragments可以接收它自己的事件
- 一个Fragment可以放在多个Activity中,一个Activity中也可以放置多个Fragments
- Fragments有它自己的生命周期,而且受到它所在的宿主Activity的生命周期的影响
Fragment的生命周期:
onAttach()
当Fragment与Activity建立关联的时候调用,Activity作为参数传入。
onCreate()
创建Fragment的时候系统会调用此函数。
onCreateView()
创建Fragment的UI.
这个方法必须返回一个View。
表示这个Fragment的根布局。
onActivityCreated()
当Activity的onCreate()方法返回时调用。
onStart()
当Fragment第一次绘制它的UI的时候调用。
onResume()
当Fragment可见且可交互时调用。
onPause()当用户离开当前Fragment时调用这个方法。
通常用来保存持久化数据。onStop()
当Fragment不可见时调用。可能情况:activity被stopped或fragment被移除,加入到回退栈。一个stopped的fragment任然是活着的,如果长时间不用也会被移除。
onDestroyView()
当Fragment的UI被删除的时候调用。
onDestory()
当Fragment销毁时调用
onDetach()
当Fragment与Activity取消关联的时候调用。
一个Fragment可以处于3种状态:
- 运行状态
- Fragment在当前运行的Activity中可见。
- 暂停状态
- 另一个Activity在前台,具有焦点,但是Fragment所在的Activity依然可见。
- 停止状态
- Fragment不可见。宿主Activity处于停止状态或者Fragment已经从Activity删除并添加到后台栈中。
Fragment的宿主Activity的生命周期直接影响Fragment的生命周期。因此,Activity的每个生命周期回调函数都会调用对应的Fragment的回调函数。例如,当宿主Activity的onPause()方法被调用的时候,Fragment的onPause()方法也会被调用。
Activity 与 Fragment 生命周期对比:
Fragment 懒加载:
自定义一个 LazyLoadFragment 基类,利用 setUserVisibleHint 和 生命周期方法,通过对 Fragment状态判断,进行数据加载,并将数据加载的接口提供开放出去,供子类使用。然后在子类 Fragment 中实现 requestData 方法即可。这里添加了一个 isDataLoaded 变量,目的是避免重复加载数据。考虑到 有时候需要刷新数据的问题,便提供了一个用于强制刷新的参数判断。 public abstract class LazyLoadFragment extends BaseFragment {protected boolean isViewInitiated; protected boolean isDataLoaded; @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState); isViewInitiated = true; prepareRequestData(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser); prepareRequestData(); } public abstract void requestData(); public boolean prepareRequestData() { return prepareRequestData(false); } public boolean prepareRequestData(boolean forceUpdate) { if (getUserVisibleHint() && isViewInitiated && (!isDataLoaded || forceUpdate)) { requestData(); isDataLoaded = true; return true; } return false; } }
Fragment状态保存:
Fragment 状态保存入口 :
- 1、Activity的状态保存, 在Activity的onSaveInstanceState()里, 调用了FragmentManger的 saveAllState()方法, 其中会对mActive中各个Fragment的实例状态和View状态分别进行保存.
- FragmentManager还提供了public方法: saveFragmentInstanceState(), 可以对单Fragment进行状态保存, 这是提供给我们用的。
- FragmentManager的moveToState()方法中, 当状态回退到ACTIVITY_CREATED, 会调用saveFragmentViewState()方法, 保存View的状态
Fragment 在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化。 Fragment生命周期:
- 当fragment被创建的时候,它会经历以下状态:
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- 当fragment对用户可见的时候,它会经历以下状态:
- onStart()
- onResume()
- 当fragment不可见的时候,它会经历以下状态:
- onPause()
- onStop()
- 当fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态:
- onPause()
onStop() onDestroyView() onDetach()
————————————————
版权声明:本文为CSDN博主 CongPong 的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CongPong/article/details/125891899
我在Ruby中有很多时间范围:period=Time.parse('8:00am')..Time.parse('8:00pm')incidents=[Time.parse('7:00am')..Time.parse('9:00am'),Time.parse('1:00pm')..Time.parse('3:00pm'),Time.parse('1:30pm')..Time.parse('3:30pm'),Time.parse('7:00pm')..Time.parse('9:00pm'),]我正试图在这段时间内获得一系列无事件block。对于以上内容:[Time.parse('9:00
unicorn有OobGC可用于在一定数量的请求后运行GC.start的机架中间件。PhusionPassenger中有类似的东西吗? 最佳答案 PhusionPassenger4正式引入了带外垃圾回收机制。它比Unicorn更灵活,允许任意工作,而不仅仅是垃圾收集。http://blog.phusion.nl/2013/01/22/phusion-passenger-4-technology-preview-out-of-band-work/ 关于ruby-on-rails-有没有一种
我有一个rubyonrails应用程序,我试图在其中找到每隔几秒运行一些代码的方法。我发现了很多使用cron或类似cron的实现的信息和想法,但这些只是准确到分钟,并且/或需要外部工具。我想每15秒左右启动一次任务,并且我希望它完全独立于应用程序中(如果应用程序停止,任务也停止,并且没有外部设置)。这用于缓存数据的后台生成。每隔几秒,任务就会收集一些数据,然后将其存储在缓存中,供所有客户端请求使用。该任务非常慢,因此需要在后台运行并且不阻塞客户端请求。我是ruby的新手,但有很强的perl背景,我解决这个问题的方法是创建一个间隔计时器和处理程序,它fork、运行代码,然后在完成
我正在尝试了解Rails应用程序的生命周期。application_controller.rb什么时候运行?是每次更改时只执行一次,还是每次请求时都执行一次?我想了解以下文件:config/environments/*.rb(开发、生产或测试,取决于当前模式)boot.rb环境.rb路线.rb我问这个的原因之一是,我想知道放在哪里比较好初始化代码自定义配置数据编辑:@Gdeglin的回答很好,但我实际上很想知道这些文件中的每一个何时运行。 最佳答案 应用程序Controller.rbApplicationController是所有C
在Sinatra中,我无法创建在应用程序生命周期中仅分配一次值的全局变量。我错过了什么吗?我的简化代码如下所示:require'rubygems'ifRUBY_VERSION这导致nil2在终端和,2在浏览器中。如果我尝试将@a=1放入initialize方法中,我会在WebApp.run!中遇到错误线。我觉得我错过了一些东西,因为如果我不能有全局变量,那么我如何在应用程序实例化期间加载大数据?beforedo似乎每次有来自客户端的请求时都会被调用。 最佳答案 classWebApp请注意,如果您使用Shotgun或其他在每次请求时
所以我有一个使用React和Ajax调用的有趣案例。在上下文中,我有一个带有3个选项卡的Accordion。初始化Accordionreact组件后,我首先打开第一个选项卡,其余选项卡关闭。每个选项卡的主体中都有所谓的DictionaryCall组件,如下所示:returnclassDictionaryCallextendsReact.Component{constructor(props){super();this.state={word:'',data:[],error:false,nodata:false,initialLoaded:props.load}}componentDi
我正在Javascript上构建自定义slider,我希望每次用户单击slider的div时,slider都应停止X秒。我的代码是:$(document).ready(function(){varciclo;varindex_slide=1;functionstartSlidercicle(){ciclo=setInterval(function(){//Slidercodegoeshere},3000);}//HereIstarttheslideranimationstartSlidercicle();//Whentheuserclicksonadivcalled'slide',st
这是一个例子:混入.jsexportdefault{methods:{aFunction(){//Somefunctionalityhere}}}组件.vueimportmixinfrom'./mixin'exportdefault{mixins:[mixin]created(){//CallaFunctiondefinedinthemixinhere}}我想从组件内部的created()生命周期方法访问在mixin方法内部定义的aFunction。 最佳答案 mixin方法与组件的当前实例合并,所以它只是:created(){th
我想知道javascriptblock/函数是否在加载后始终可用。因为我已经测试了一些东西,现在我有点困惑。我将一个脚本block定义到一个div中。脚本block有一个事件处理函数,用于元素使用ajax重新加载div。ajax调用返回div的纯html并将其替换为当前的html。但这意味着替换执行的脚本。我认为脚本会在替换语句后停止执行。但它没有。执行替换语句后的代码行那么这些东西是如何工作的。您如何描述脚本block的生命周期? 最佳答案 当代码包含在script中时元素被求值时,代码求值的结果成为页面运行时环境的一部分。删除s
我正在实现处理选项卡的GoogleChrome扩展程序。这包括我获取onCreated、onUpdated和onActivated。每次,我都在我的逻辑中使用tabId,它最初在处理onCreated事件期间存储在一个数组中。原则上,一切正常。但是,我注意到了一个小故障。有时,现有选项卡的ID会更改。因此,一个选项卡有一个不在我的数组中的ID,这自然会导致错误。我可以在以下用例中重现此问题:使用不同的URL打开2个或更多标签在一个选项卡中加载一个已在另一个选项卡中加载的URL在这种情况下,会发生两件事:首先,触发T的onActivated事件,而不是onUpdated事件。其次,T现在