Fragment在3.0后增加:android.app.Fragment。
在v4的兼容包里也有。
一般为了兼容性还是可能会用:android.support.v4.app.Fragment
生命周期:
onAttach,onCreate,onCreateView,onActivityCreated,onStart,onResume,
onPause,onStop,onDestroyView,onDestroy,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
FragmentManager fragmentManager = getFragmentManager(); //3.0以上在Activity中使用
FragmentManager fragmentManager = getSupportFragmentManager(); //使用V4包,应使用FragmentActivity
FragmentTransaction fragmentTransaction = 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 =fm.beginTransaction();
ft.add(new asdf(),"frag1");
ft.addToBackStack("back1");
ft.commit();
ft.add(new asdff(),"frag2");
ft.commit(); //这时按back,弹出backStack中的 back1-frag1
例2
ft =fm.beginTransaction();
ft.add(new asdf(),"frag1");
ft.addToBackStack("back1");
ft.commit();
ft.add(new asdff(),"frag2");
ft.addToBackStack("back2");
ft.commit();//这时按back,先弹出back2,再按back。才弹出back1
例3
ft =fm.beginTransaction();
ft.add(new asdf(),"frag1");
ft.addToBackStack("back1");
ft.commit();
fm.popBackStack();//这里已经将back1弹出栈
ft.add(new asdff(),"frag2");
ft.addToBackStack("back2");
ft.commit();// 这时按back。仅仅弹出back2
附 “在同一layout中切换Fragment(不又一次载入fragment)” 代码:
private FragmentManager manager; private FragmentTransaction transaction; private Fragment currentFrag; /** * @param displayFrag 要显示的fragment * * @author stone */ private void display(Fragment displayFrag) { if (currentFrag != displayFrag) { transaction = manager.beginTransaction(); if (displayFrag == null) return; if (displayFrag.isAdded()) { transaction.show(displayFrag); } else { transaction.add(R.id.fl_content, displayFrag); } if (currentFrag != null) { transaction.hide(currentFrag); } currentFrag = displayFrag; transaction.commit(); } }