fragment的作用
它的出现是为了解决Android碎片化 ,它可作为Activity界面的组成部分,可在Activity运行中实现动态地加入、移除和交换。一个Activity中可同时出现多个Fragment,一个Fragment也可在多个Activity中使用。-
fragment的生命周期
onAttach()
当Fragment和Activity建立关联时调用
onCreateView()
当Fragment创建视图时调用
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_movie, container, false);
return view;
}
}
onActivityCreated()
当与Fragment相关联的Activity完成onCreate()之后调用
onDestroyView()
在Fragment中的布局被移除时调用
onDetach()
当Fragment和Activity解除关联时调用
- 打开含有fragment的activity
fragment: onCreate() --> fragment: onCreateView() --> activity: onCreate() --> fragment: onActivityCreated() --> Activity onStart() --> fragment: onStart() --> activity: onResume() --> fragment: onResume() - 按下home
fragment: onPause() --> activity: onPause() --> fragment: onStop() --> activity: onStop() - 重新启动
activity: onRestart() --> activity: onStart() --> fragment: onStart() --> activity: onResume() --> fragment: onResume() - back
fragment: onPause() --> activity: onPause() --> fragment: onStop() --> activity: onStop --> fragment: onDestoryView() --> fragment: onDestory() --> fragment: onDetach() --> activity: onDestory()
Fragment生命周期与Activity生命周期的一个关键区别就在于,Fragment的生命周期方法是由托管Activity而不是操作系统调用的。Activity中生命周期方法都是protected,而Fragment都是public.
- 动态加载fragment
新建一个fragment类继承Fragment:
public class MyFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/**
* 加载布局文件然后返回view,显示在Activity
*/
View view = inflater.inflate(R.layout.title, container,false);
return view;
}
}
activity中绑定
MyFragment fragment = new MyFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fragmentLayout, fragment);//放入activity的layout中,可以只是个空的LinearLayout
transaction.commit();
第一步,先用getFragmentManager()方法获取一个FragmentManager对象,再通过它的beginTransaction()获取一个FragmentTransaction的实例。
第二步,用beginTransaction.add()方法通过id将MyFragemnt实例添加到main布局里LinearLayout里。一定要注意,add()方法里的第一个参数是容器视图资源Id,而不是layout。容器视图资源Id有两个作用:告知FragmentManager,碎片视图应该出现在活动视图的什么地方;它也是FragmentManager队列中碎片的唯一标识符。而静态加载时碎片的唯一标识符正是在活动布局里< fragment>下的id。
第三步:调用beginTransaction.commit()提交。另外,如果允许用户通过按下返回按键返回到前一个Fragment状态,在调用commit()之前先调用addToBackStack(true)方法。
- Fragment与Activity之间通信
MyFragment myFragment = (MyFragment)fragmentManager(). findFragmentById(R.id.fragmentLayout);
- Fragment之间通信
getActivity()