Fragment是什么?
Fragment(片段,碎片)在3.0以后出现,主要是为了在大屏幕设备上支持动态的和更灵活的UI设计(众所周知android 3.0只转为平板电脑设计,屏幕显示方面跟手机相比差异比较大)。为了适应大屏幕设备上面视图的转换所以设计了fragment。
fragments.png从上图可以看出一个Activity中可以有多个Fragment,一个Fragment可以被多个Activity使用
Fragment必须显示在Activity中
Fragment生命周期
fragment_lifecycle.png因为Fragment依存于Activity所以当Activity生命周期结束时Fragment生命周期也会结束
1,初始化阶段 4个
onAttach() 与归属Activity建立连接
onCreate() 初始化Fragment
onCreateView() 初始化Fragment中显示的UI布局
onActivityCreatde() 归属Activity的onCreate()方法执行完成
2, 显示/隐藏 4个
onStart() 显示Fragment
onResume() 获得用户焦点
onPause() 失去用户焦点
onStop() 关闭Fragment
3, 销毁阶段 3个
onDestroyView() 销毁Fragment显示的UI布局
onDestroy() 销毁Fragment
onDetach() 与归属Activity断开连接
静态方式:
显示: F:onAttach -- F:onCreate -- F:onCreateView -- M:onCreate -- F:onActivityCreated -- M:onStar -- F:onStrar -- M:onResume -- F:onResume
退出: F:onPause -- M:onPause -- F:onStop -- M:onStop -- F:onDestroyView -- F:onDestroy -- F:ondetach -- M:onDestroy
动态方式:
显示: M:onCrate -- F:onAttach -- F:onCreate -- F:onCreateView --F:onActivityCreated -- M:onStar -- F:onStrar -- M:onResume -- F:onResume
退出: F:onPause -- M:onPause -- F:onStop -- M:onStop -- F:onDestroyView -- F:onDestroy -- F:ondetach -- M:onDestroy
如何创建Fragment
- 定义一个类继承Fragment
public classMyFragment extends Fragment{} - 重写父类的生命周期的方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, null);//fragment为自定义要显示的布局
return view;
}
Fragment的显示方式
- 静态显示(固定内容,不需要接受数据)
1.在Activity要显示的布局文件中通过<fragment/>标签引入
2.在标签中需指定id,用来标识Fragment的唯一性(因为一个Activity可以有多个Fragment)
3.在标签中指定name属性,指定要显示的Fragment(属性值为包名.类名) - 动态显示
1.在显示的布局页面中,通过布局容器占位
2.在Activity中得到Fragment管理器对象
FragmentManager manager = getFragmentManager();
3.开启一个事务
FragmentTransaction transaction = manager.beginTransaction();
4.动态显示Fragment
transaction.replace(R.id.layout1, new Left_Fragment());
5.提交事务
transaction.commit(); - tansaction方法
替换 replace
移除 remove
添加 add
隐藏 hide
显示 show
transaction.addToBackStack(null);//将当前的Fragment加入到回退栈中
Fragment传值
- Activity向Fragment传值
Activity中
Bundle bundle = new Bundle();
bundle.putString(key,value);
fragment.setArguments(bundle);
Fragment中
Bundle bundle = getArguments();
String key = bundle.getString(key); - Fragment向Activity传值(接口回调)
Fragment中
public void getEditText(CallBack callBack)
{
String msg = et.getText().toString().trim();
callBack.sendResult(msg);
}
//回调接口
public interface CallBack
{
public void sendResult(String result);
}
Activity中
fragment.getEditText(new CallBack() {
@Override
public void sendResult(String result) {
tv.setText(result);
}
}); - Fragment向Fragment传值
LeftFragment :
//传值
RightFragment fragment = new RightFragment();
Bundle args = new Bundle();
args.putString("name", data.get(position));
fragment.setArguments(args);
RightFragment:
//取值
Bundle bundle = getArguments();
String name = bundle.getString("name");
网友评论