最近一直在看官方文档,觉得不能一直看,还是捡重要的记一下吧。
Fragment是官方提倡使用的组件,具有非常好的灵活性和复用性。尤其在一些需要支持tablet和phone的情况下,是提高Application的适配性的途径之一。Fragment必须要嵌入到Activity中使用,它具有自己的life cycle(受父Activity的影响)和input event,具有自己的back stack,但是由Activity来直接管理的。
我们知道Activity异常退出时,需要保存数据,当数据比较大时,我们可以生成一个Object,交给Fragmen来保存。
public class RetainedFragment extends Fragment {
// data object we want to retain
private MyDataObject data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(MyDataObject data) {
this.data = data;
}
public MyDataObject getData() {
return data;
}
}
public class MyActivity extends Activity {
private RetainedFragment dataFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(“data”);
// create the fragment and data the first time
if (dataFragment == null) {
// add the fragment
dataFragment = new DataFragment();
fm.beginTransaction().add(dataFragment, “data”).commit();
// load the data from the web
dataFragment.setData(loadMyData());
}
// the data is available in dataFragment.getData()
...
}
@Override
public void onDestroy() {
super.onDestroy();
// store the data in the fragment
dataFragment.setData(collectMyLoadedData());
}
}
Fragment的life cycle受父Activity的影响,官方文档有一副图,鲜明的描述了Fragment的生命
周期:
有两种方式在Activity中添加Fragment,一种是在xml文件中直接添加,一种是使用FragmentTransaction在代码中动态添加。添加完Fragment后,系统是根据id或者tag来管理该Fragment的。
动态添加Fragment后,需要调用commit()函数,注意调用后不能保证,目标Fragment立刻添加到了指定位置,如果有此需求需调用 executePendingTransactions()。
当你将Fragment添加到back stack时,commit()调用前的一切操作,被保存为一个状态,当你按back pressed后,返回该状态。
在Fragment中可以使用getActivity()获得Context,但是当该Fragment在Activity中detached后,调用getActivity()会返回null。
管理使用ActionBar,在Fragment中可以添加MenuItem,但是必须在onCreate(…)调用setHasOptionMenu(true)。当MenuItem点击后,首先是Activity的onOptionMenuClicked监听到,未处理的事件交给Fragment。
你可以获得Fragment的先前状态通过Bundle, 该Bundle会传给 onSaveInstanceState()\ onCreate(), onCreateView()\onActivityCreated().
另外,当用户离开当前Activity时,如果需要执行一个transaction,则必须在该Activity保存其状态前。