首页 > 代码库 > Android Fragment
Android Fragment
生命周期:
onAttach,onCreate,onCreateView,onActivityCreated,onStart,onResume,
onPause,onStop,onDestroyView,onDestroyView,onDetach
三种类别:
DialogFragment
对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到 该 dialog
ListFragment
类似于ListActivity 的效果,并且还提供了ListActivity类似的onListItemCLick和setListAdapter等功能。内部维护一个ListView
使用布局android.R.layout.list_content
PreferenceFragments
类似于PreferenceActivity .可以创建类似PAD的设置界面。
使用Fragment
1. xml中使用
<fragment class="com.stone.fragment.FragmentDemoActivity$TitlesFragment" // 用成 android:name 也行 android:id="@+id/titles" android:layout_width="0px" android:layout_height="match_parent" android:layout_weight="1" />
Fragment派生类 实现onCreateView() {inflater.inflate(... 将一个layout加入到fragment中) 返回View },
2. 使用代码添加Fragment
FragmentManagerfragmentManager = getFragmentManager(); //3.0以上在Activity中使用
FragmentManagerfragmentManager = getSupportFragmentManager(); //使用V4包,应使用FragmentActivity
FragmentTransactionfragmentTransaction = fragmentManager.beginTransaction();
Fragment01dynamicFragment = new Fragment01();
fragmentTransaction.add(R.id.ll_frag_two,dynamicFragment); //有 layout---将fragment 加入到layout-ll_frag_two 中
fragmentTransaction.add(R.id.ll_frag_three,new Fragment01(),"kkk"); // “kkk” -----tag
fragmentTransaction.add(dynamicFragment,"without_layout"); //无 layout
fragmentTransaction.commit();// 提交,每段事务 都需要begintransaction
fragmentManager.findFragmentById();
fragmentManager.findFragmentByTag("tag"); //无界面的可以用 tag作唯一标识取出
fragmentManager.popBackStack(); // 从activity的后退栈中弹出fragment(这可以模拟后退键引发的动作)。返回void
fragmentManager.addOnBackStackChangedListerner(); // 注册一个侦听器以监视后退栈的变化
fragmentManager.executePendingTransactions(); // 立即执行事务
fragmentTransaction.setTransition(transit); // 设置跳转动画
fragmentTransaction.addToBackStack("options name"); //将之前的操作加入后退栈中,这时按back键,弹出fragment,恢复到之前的状态
3. 事务的注意
通过 add(),remove(), replace() 等 来操作
警告:你只能在activity处于可保存状态的状态时,比如running中,onPause()方法和onStop()方法之前提交事务,否则会引发异常。这是因为fragment
的状态会丢失。如果要在可能丢失状态的情况下提交事务,请使用commitAllowingStateLoss()。
4. 参数传递
与Activity交互,在 实现类中,getActivity(); // 得到其所在的activity
fragment间传参:fragment.setArguments(bundle);
5. Activity与Fragment共享事件
在Fragment中定义回调接口,Activity中传入。
回退栈的说明
fragmentTransaction.addToBackStack 和fragmentManager.popBackStack 的例子:
例1
ft.add(new asdf(),"frag1");
ft.addToBackStack("back1");
ft.commit();
ft =fm.beginTransaction();
ft.add(new asdff(),"frag2");
ft.commit(); //这时按back,弹出backStack中的 back1-frag1,再次按back,弹出frag2
例2
ft.add(new asdf(),"frag1");
ft.addToBackStack("back1");
ft.commit();
ft =fm.beginTransaction();
ft.add(new asdff(),"frag2");
ft.addToBackStack("back2");
ft.commit();//这时按back,先弹出back2,再按back,才弹出back1
例3
ft.add(new asdf(),"frag1");
ft.addToBackStack("back1");
ft.commit();
fm.popBackStack();//这里已经将back1弹出栈
ft =fm.beginTransaction();
ft.add(new asdff(),"frag2");
ft.addToBackStack("back2");
ft.commit();// 这时按back,只弹出back2