这几天刚好有闲暇的时间,所以打算把平常用到的和遇到的关于fragment的应用做一个总结吧;
一、fragment的生命周期, 这是刚打开fragment时的执行日志:
初次创建fragment时:
onAttach:当fragment和activity产生关联的时候调用
onCreate:和activity一样,是当fragment创建时调用
onCreateView:加载view,并将view对象并返回
onActivityCreated:当activity被创建成功时调用
onStart:结合activity当fragment可见时调用
onResume:当获取焦点时调用
fragment退出时:
onPause:失去焦点时调用
onStop:界面不可见时调用
onDestroyView:回收view对象时调用
onDestroy:fragment被销毁时调用
onDetach:取消fragment和activity的关联时调用
无论是activity还是fragment,一个完整的生命周期,都会经历:创建、界面可见、获取焦点、失去焦点、界面不可见、销毁。
因为我们知道fragment是必须关联到activity来使用的,所以这2者的生命周期还是有一些相似的地方。
创建时:
activity :onCreate
fragment:onAttach、onCreate、onCreateView、onActivityCreated
界面可见时:
activity:onStart
fragment:onStart
获取焦点时:
activity:onResume
fragment:onResume
界面不可见时:
activity:onPause
fragment:onPause
失去焦点时:
activity:onStop
fragment:onStop
销毁时:
activity:onDestroy
fragment:onDestroyView、onDestroy、onDetach
二、fragment的使用:
主要是静态使用和动态使用2种方式。静态使用就像其他控件一样直接在xml布局中使用。
如下:
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.administrator.gallerydemo.Fragment1"/>
注意:在布局中使用的时候必须要加name这个属性,引用对应的fragment到布局中。
动态添加,主要是通过FragmentTransaction来动态添加。如下:
transaction.add(new Fragment5(),"fragment").commitAllowingStateLoss();
或
transaction.replace(R.id.root_rly,new Fragment5()).commitAllowingStateLoss();
三、fragment的懒加载:
fragment和viewpager是Android中一个比较普遍的应用场景。在实际开发中,为了节约用户流量,我们往往需要限制fragment的数据加载,就是当fragment进入到可见的状态时,才需要去加载数据。所以我们可以继承Fragment,重写setUserVisibleHint
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(getUserVisibleHint()) { isVisible=true; onVisible(); }else { isVisible=false; onInVisible(); } }protected
void onInVisible() { }protected
void
onVisible(){
lazyLoad();
}
protected
abstract
void
lazyLoad();
这里当界面可见的时候,我们就可以调用onVisible,再调用lazyLoad懒加载的方法。之所以不直接调用懒加载的方法,是为了提高代码的复用性。由于setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。所以我们在使用的时候,需要这样做:http://public
class
OpenResultFragment
extends
LazyFragment{
// 标志位,标志已经初始化完成。
private
boolean
isPrepared;
@Override
public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(LOG_TAG,
"onCreateView"
);
View view = inflater.inflate(R.layout.fragment_open_result, container,
false
);
//XXX初始化view的各控件
isPrepared =
true
;
lazyLoad();
return
view;
}
@Override
protected
void
lazyLoad() {
if
(!isPrepared || !isVisible) {
return
;
}
//填充各控件的数据
}
}
参考:fragment的懒加载