韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha
活动: 创建-》启动-》获得焦点-》暂停-》停止-》销毁
碎片: 附加-》创建-》创建视图-》 活动创建-》启动-》获取焦点-》暂停-》停止-》销毁视图-》销毁-》分离
attach 附加的意思
detach 分离 的意思。
Fragment生命周期与Activity相似
Fragment必须依赖于Activity才能运行,所以Activity生命周期调用优先于Fragment,并且Fragment比Activity要轻量很多。
- onAttach:Fragment与Activity的建立关联时调用,用于获得Activity传递的值
- onCreate:视图创建之前调用
- onCreateView:创建Fragment视图时调用
- onActivityCreated:视图创建完成之后调用
- onStart:界面视图显示状态下调用
- onResume:界面视图有焦点的状态下调用
- onDestroyView:在Fragment视图被移除时调用
- onDestroy : 销毁时调用
- onDetach : 当Fragment不再依附于Activity时调用
Fragment启动流程
Fragment创建时调用:
onAttach——>onCreate——>onCreateView——>onActivityCreated——>onStart——>onResumeFragment不可见时调用:
onPause——>onStopFragment销毁时调用:
onPause——>onStop——>onDestroyView——>onDestory——>onDetach流程图
开发过程中需要注意,可能会常用到的方法
setUserVisibleHint() 该方法是在onCreateView之前调用,所以该方法不能操作视图。不然回报空指针错误
使用场景:当与ViewPager使用时内部有个提前缓存的机制(默认是提前缓存一页),可以通过该方法做懒加载的处理。因为ViewPager的机制,初始化的过程中会加载前与后两个Fragment,用户还未手动触发第二页时就已经加载了后一个Fragment并进行网络请求渲染数据,完全违背了懒加载机制。所以需要使用该方法,当此Fragment可见时则进行网络请求并实现数据渲染刷新界面。
注意事项:在未使用ViewPager,而是自己通过FragmentTransaction 对Fragment进行add hide show操作,setUserVisibleHint()方法没有被调用。原因是hide()和show()方法调用时Fragment不走任何的生命周期。
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { //界面可见 } else { //界面不可见 } }
onHiddenChanged() 用FragmentTransaction来控制fragment的hide和show时,那么这个方法就会被调用。每当你对某个Fragment使用hide或者是show的时候,那么这个Fragment就会自动调用这个方法。
(使用情况:你自己去管理Fragment,而不是用viewpager管理的时候)
部分摘自http://blog.csdn.net/lmj623565791/article/details/37970961/
安卓Fragment与生命周期
Fragment简介
Fragment意为片段,顾名思义就是可以作为Activity的一部分。
针对各式各样的屏幕尺寸,Fragment可以灵活的布局,让用户有更好的体验。
Fragment为Activity界面的一个组成部分,Activity可以由多个不同的Fragment组成,Fragment可以由自己的生命周期与接收、处理用户事件,这样就不必为Activity写一堆控件代码了,Fragment可以动态的添加、移除、替换。
Fragment的使用
实现像手机QQ那样的布局。
Fragment可以像手机QQ那样实现联系人、消息、动态的三个板块互相转换。
先在主Activity中写一个Fragment,然后写三个按钮,在写3个Fragment的XML文件,把Fragment板块依附到主Activity的Fragment板块上面就可以了。
主Activity
<FrameLayout android:layout_weight="1" android:id="@+id/flconten" android:background="#fff" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="horizontal" > <Button android:id="@+id/btn1" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="消息" /> <Button android:id="@+id/btn2" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="联系人" /> <Button android:id="@+id/btn3" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动态" /> </LinearLayout>
消息XML文件
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="消息" android:textSize="30dp" />
联系人XML文件跟消息一样,动态无XML文件,使用Java代码代替。
在Java代码中MainActivity,初始化时获取Fragment管理者的支持,开启新事务,添加一个Fragment片段。
fm = getSupportFragmentManager(); transaction = fm.beginTransaction(); transaction.add(R.id.flconten, msgFragment); transaction.commit();
private FragmentTransaction transaction; private FragmentManager fm;
运行后效果是这样
按钮的监听
开启新事务,然后替换掉旧的Fragment
public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.btn1: transaction = fm.beginTransaction(); transaction = transaction.replace(R.id.flconten, msgFragment); transaction.commit(); break; case R.id.btn2: transaction = fm.beginTransaction(); transaction.replace(R.id.flconten, contactFragment); transaction.commit(); break; case R.id.btn3: transaction = fm.beginTransaction(); transaction.replace(R.id.flconten, doFragment); transaction.commit(); break; default: break; } }
消息与联系人的Fragment关联到了XML文件
public class MsgFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 打气筒动态去关联一个布局文件 View inflate = inflater.inflate(R.layout.msg_fragment, null); return inflate; } }
动态的Fragment没关联到XML文件,用代码自动生成Fragment
public class DoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(getActivity()); textView.setText("动态"); textView.setTextSize(30); return textView; } }
最终效果图
Fragment的生命周期
把所有的方法都写上到ContactFragment,一一测试,然后输出的顺序
Fragment必须是依附到Activity上的,所以Activity的生命周期会直接影响到Fragment的生命周期。
若Activity是暂停状态,所有的Fragment都是暂停状态,若Activity是Stop状态,所有的Fragment都不能被启动,若Activity被销毁,那么所有的Fragment都会被销毁。
当Fragment进行转换操作,把Fragment放到Activity中的back stack中,用户就可以进行返回操作了。
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha
活动: 创建-》启动-》获得焦点-》暂停-》停止-》销毁
碎片: 附加-》创建-》创建视图-》 活动创建-》启动-》获取焦点-》暂停-》停止-》销毁视图-》销毁-》分离
attach 附加的意思
detach 分离 的意思。
转载于:https://www.cnblogs.com/yue31313/p/7382055.html
对fragment和tab的流程不太清楚 以至于MainActivity中的frag实例化后,再多线程调用时内部变量总是为null,记录下生命周期流程 备忘 其中FragmentVideoCall继承自fragment
MainActivity->onCreate
actionbar和TabListener在此 addTabListener->onTabSelected
fragment在此实例化
FragmentVideoCall->onCreateView
FragmentVideoCall->onActivityCreatedFragmentVideoCall->onStart
此三步中初始化frag中各种变量
MainActivity->onResume
frag在此从TabListener中获取实例