生命周期
Create阶段:
onAttach,onCreate,onCreateView,onActivityCreated
Destory阶段:
onDestroyView,onDestory,onDettach.
onAttached()
当fragment被加入到activity时调用(在这个方法中之后可以获得所在的activity)
onCreateView()
当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
onActivityCreated()
当activity的onCreated()方法返回后调用此方法
onDestroyView()
当fragment中的视图被移除的时候,调用这个方法。
onDetach()
当fragment和activity分离的时候,调用这个方法。
Activity传递数据给Fragment
在Activity中,将数据放到Bundle对象,调用Fragment对象的setArguments(Bundle bundle) 存入数据
在Fragment中,使用getArguments()获取到在Activity中存入的Bundle
1 2 3 4 5 6 7 8 9 10 |
// Activity // 通过Bundle对象传递数据 MyFragment fragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putCharSequence("parms", "p"); fragment.setArguments(bundle); //Fragment //取出数据,在MyFragment中调用下面的方法 String name = (String) getArguments().getCharSequence("parms"); |
Fragment之间传递数据
Fragment之间最好不要直接传递,借助activity传递
步骤:
1. 使Activity implements一个接口A,重写A中的方法
2. Fragment中使用getActivity()将activity强制转换为接口A(如果activity没有实现接口,则会报错),赋值给Fragment中的A实例,回调
在Activity中重写的方法中调用另一个Fragment的public方法
与Activity交互
调用Activity中的方法
mainActivity = (MainActivity) getActivity(); 使用获取到的对象调用MainActivity中的方法
获取关联的同一个Activity上的另一个Fragment中的控件
1 2 |
//其中Button在另一个Fragment, getActivity()获取关联的Activity, 在调用findViewById方法 Button button = (Button) getActivity().findViewById(R.id.button); |
回退栈
transaction.addToBackStack(String name);
调用tx.addToBackStack(null);将当前的事务添加到了回退栈,所以Fragment实例不会被销毁,但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView.
清空回退栈 getFragmentManager().popBackStackImmediate( null ,1);
切换Fragment
FragmentTransaction对象调用show,add,hide,replace方法
示例:
getFragmentManager().beginTransaction().replace(R.id.contain, fragment);
不推荐直接使用replace切换Fragment,建议使用add+show显示Fragment,同时使用hide隐藏上一个Fragment;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** 隐藏上一个Fragment */ private void hidePreFragment(FragmentTransaction fragmentTransaction) { switch (currIndex) { case FragmentSet.CONTACT: fragmentTransaction.hide(contactFragment); break; } } /** 显示下一个Fragment */ private void showNextFragment(FragmentTransaction fragmentTransaction, Fragment fragment) { if (!fragment.isAdded()) { fragmentTransaction.add(R.id.frag_contain, fragment).commit(); } else { fragmentTransaction.show(fragment).commit(); } } |
hide方法调用时会触发Fragment的onHiddenChanged回调
注意点
在new一个新的Fragment对象前, 判断该变量名是否为空, 非空时在new新的对象
防止Activity重载时Fragment重复新建, 造成重叠
1 2 3 4 |
if (fragment == null) { fragment = new MyFragment(); } |
0 Comments