Android Fragment

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



原文地址:https://www.cnblogs.com/cxchanpin/p/7043921.html