Android Fragment

来源:互联网 发布:新版本mac 启动输入法 编辑:程序博客网 时间:2024/06/04 18:54

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();}}



2 1