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中使用
<fragmentclass="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();}}