首页 > 代码库 > 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