您的位置:首页 > 其它

fragment中onCreateView与onActivityCreated的区别,以及fragment中生命周期的利用

2015-11-12 15:53 337 查看
最近使用了一个自定义的view在activity中运行正常,可在fragment中就奔溃,无提示,之前view是在onCreateView中初始化并调用的,崩溃,换到onActivityCreated之后,运行ok了,这是什么原因呢??

先看看fragment的生命周期,首次展示界面时



可以看到onActivityCreated是在onCreateView之后调用的,那么如果在onCreateView方法的时候直接初始化view,并调用,和在onActivityCreated时调用,有什么区别呢

网上有网友回复

If your view is static, then moving any code to the onActivityCreated method is not necessary. But when you - for instance, fill some lists from the adapter, then you should do it in the onActivityCreated method as well as restoring the view state when setRetainInstance
used to do so.

Also accessing the view hierarchy of the parent activity must be done in the onActivityCreated, not sooner.
哦,,大概意思就是如果view是静态的,那么没有必要在onActivityCreated 方法去调用,大多数的自定义的view,初始化时都需要一个context,而activity是context的子类,所以在onCreateView方法的时候非静态的view初始化调用可能出现异常,所以对于非静态的view,最好在onActivityCreated方法调用

fragment 生命周期的利用

生命周期有 onAttach(),onCreate(),onCreateView(),onActivityCreated();此为创建时会执行的方法

onstart(),onResume(),是变得可见时会执行的方法

onPause(),onStop(),是进入后台会执行的方法。

销毁时会执行 onpause(),onStop(),onDestroyView(),Ondestroy();

我们经常将fragment放在activity中使用,数据是activity获得,而在fragment中展示,那么如何比较简单的实现,在fragment中展示activity的数据呢,

1 我们首先想到的就是,在fragment中增加一个属性,如在fragment中定义一个list集合,然后在activity中调用fragment的构造方法时来给list赋值,可是fragment跟普通的类不一样,他有自己的生命周期,这样做会报错。

2 那么我们是不是就一定要利用回调来实现呢,其实不用,我们刚刚看了onStart()方法,是在进入前台可见时才调用,那么

我们可以在fragment中添加list的set方法,在activity中new 了fragment后,调用set方法给list赋值,最后,重写fragment的onStart()方法,在此方法中展示list的数据

代码如下

这是fragment中的set方法

private JSONObject json;

public PayforFragment() {
// Required empty public constructor
}

public void setJson(JSONObject json) {
this.json = json;
}

这是重写的fragment的onStart()方法

@Override
public void onStart() {
try {
JSONObject jos = new JSONObject(json.getString("data"));
name.setText(jos.getString("studentName"));
phone.setText(jos.getString("phoneNum"));
bTime.setText(jos.getString("startDate"));
oTime.setText(jos.getString("endDate"));
idCard.setText(jos.getString("idCard"));
pxbj.setText(jos.getString("trainingInfoName"));
je.setText(jos.getString("trainingCost"));
} catch (Exception e) {

}
super.onStart();
}

这是在activity中的对fragment的json赋值

AlreadyPayForFragment fragment= new AlreadyPayForFragment();
fragment.setJson(jsonObject);
FragmentManager fragmentManager =getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame, fragment).commit();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: