今天學習下 Android中的 Fragment 和 FragmentActivity,因為沒有4.0手機,平臺是2.3.3 所以我是使用 v4 support 包來進行學習。
要想用Fragment 功能必須先讓activity繼承FragmentActivity,其原因是里面包含了Fragment運作的FragmentManager接口的實現(xiàn)類 FragmentManagerImpl ,由這個類管理所有Fragment的顯示、隱藏
?
1.使用最簡單的Fragment,我們只要繼承Fragment就可以
?
[java]?view plaincopy
public?class?TextFragment?extends?Fragment{????????????private?String?mMsg;????????????public?void?setMessage(String?message){??????????this.mMsg?=?message;??????}????????????@Override??????public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??????????????Bundle?savedInstanceState)?{??????????????????final?Context?context?=?getActivity();??????????FrameLayout?root?=?new?FrameLayout(context);??????????root.setBackgroundColor(Color.YELLOW);??????????TextView?tv?=?new?TextView(context);??????????tv.setText(mMsg);??????????tv.setGravity(Gravity.CENTER);??????????root.addView(tv,?new?FrameLayout.LayoutParams(??????????????????ViewGroup.LayoutParams.FILL_PARENT,?ViewGroup.LayoutParams.FILL_PARENT));??????????return?root;??????}????}?? 首先Fragment 就可以把它當作一個view , 只不過這個view 與 activity一樣有了生命周期函數(shù)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
Fragment.onCreateView() 函數(shù)就是用于生成這個Fragment布局的view的,類似baseadapter.getView()
這樣一個包含一個TextView的簡單布局就完成了。
2.重寫我們自己的FragmentActivity.
這里面主要要通過FragmentManager 來進行Fragment的添加和刪除:
?
[java]?view plaincopy
public?class?DoorFragmentActivity?extends?FragmentActivity{????????public?static?final?String?FRAG_SMS?=?"sms_list_frag";??????public?static?final?String?FRAG_TEXT?=?"text_frag";????????????private?Fragment?mSMSFragment;??????private?Fragment?mTextFragment;??????private?FragmentManager?mFragMgr;????????????private?Button?mMenuBtn;????????????@Override??????protected?void?onCreate(Bundle?savedInstanceState)?{??????????????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.door_fragment_activity_layout);??????????mFragMgr?=?getSupportFragmentManager();??????????mMenuBtn?=?(Button)?findViewById(R.id.door_menu_btn);??????????mMenuBtn.setOnClickListener(new?OnClickListener()?{????????????????????????????@Override??????????????public?void?onClick(View?v)?{??????????????????????????????????showFragments(FRAG_TEXT,?true);??????????????}??????????});??????????mMenuBtn.setOnLongClickListener(new?OnLongClickListener()?{????????????????????????????@Override??????????????public?boolean?onLongClick(View?v)?{????????????????????????????????????????????????????return?false;??????????????}??????????});??????????initFragments();??????????showFragments(FRAG_SMS,?false);??????}????????????private?void?initFragments(){??????????mSMSFragment?=?new?SMSListFragment();??????????TextFragment?textfrag?=?new?TextFragment();??????????textfrag.setMessage("這是?菜單界面");??????????mTextFragment?=?textfrag;????????????????}????????????private?void?showFragments(String?tag,?boolean?needback){??????????FragmentTransaction?trans?=?mFragMgr.beginTransaction();??????????if(needback){??????????????trans.setCustomAnimations(R.anim.frag_enter,????????????????????????R.anim.frag_exit);??????????????trans.add(R.id.door_root_content_fl,?getFragmentByTag(tag),?tag);??????????????trans.addToBackStack(tag);??????????}else{??????????????trans.replace(R.id.door_contents_fl,?getFragmentByTag(tag),?tag);??????????}??????????trans.commit();??????}????????????private?Fragment?getFragmentByTag(String?tag){??????????if(FRAG_SMS.equals(tag)){??????????????return?mSMSFragment;??????????}??????????if(FRAG_TEXT.equals(tag)){??????????????return?mTextFragment;??????????}??????????return?null;??????}??}?? ?
- 首先我們獲取FragmentManager實現(xiàn):直接調用 FragmentActivity.getSupportFragmentManager(),看源碼可以知道這返回的是FragmentManager內部定義的實現(xiàn)類FragmentManagerImpl。
- 我們獲取了FragmentManagerImpl后我們其實不咋操作這個類,只調用FragmentManager.beginTransation(),這個獲取FragmentTransation接口的實現(xiàn)類(里面具體是BackStackRecord類的實例),我們關于Fragment的所有操作都是通過它來完成的,因為沒仔細研究,我只了解直接自己在代碼里面定義Fragment而沒有在xml里面寫(xml寫覺得有點別扭)
我們主要通過 FragmentTransation的一些方法來處理Fragment的:
?
1)?trans.add(fragment, tag); ?這個實際是 containerViewId = 0 調用的3)
2)?trans.add(containerViewId, fragment); ?這個實際是 tag = null 調用的 3)
3)?trans.add(containerViewId, fragment, tag); ?如果containerViewId != 0實際上調用的是獲取到
? ?fragment的 onCreateView方法返回的view 并加入到containerViewId這個viewgroup中去即? ? ? ? ? ? ? ?? ?viewgroup.addView(fragment.onCreateView());
未解決問題:containerViewId = 0 的時候代表什么??
4) trans.replace(containerViewId, fragment) ?一樣是null tag調用 5)
5)?trans.replace(containerViewId, fragment, tag) ?這個一樣是添加一個fragment到對應的container中去,只不過比add多了一步對相同containerViewId中已有的fragment檢索,進行removeFragment操作,再去添加這個新來的fragment
6) trans.addToBackStack(tag); 如果你的fragment對于back鍵有類似activity的回退響應,就要記得把它加入到里面去,trans里面模擬了棧,但是我的回退沒有響應我設置的exit anim 這個無語還沒解決
3.再使用下ListFragment,我這里寫的是SMSListFragment繼承了ListFragment:
?
[java]?view plaincopy
public?class?SMSListFragment?extends?ListFragment{????????????private?ConversationListAdapter?mAdapter;??????private?ConversationQuery?mQuery;??????private?long?startTime;????????????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{??????????????????super.onCreate(savedInstanceState);??????????mAdapter?=?new?ConversationListAdapter(getActivity());??????????mQuery?=?new?ConversationQuery(getActivity().getContentResolver());??????}????????????@Override??????public?void?onActivityCreated(Bundle?savedInstanceState)?{??????????????????super.onActivityCreated(savedInstanceState);??????????setListAdapter(mAdapter);??????}????????????@Override??????public?void?onStart()?{??????????????????super.onStart();??????????startAsyncQuery();??????}????????????@Override??????public?void?onStop()?{??????????????????super.onStop();??????????mAdapter.getCursor().close();??????????mAdapter.changeCursor(null);??????}????????????public?void?startAsyncQuery()?{??????????startTime?=?System.currentTimeMillis();??????????mQuery.startQuery(1,?null,?Conversation.sAllThreadsUri,??????????????????Conversation.ALL_THREADS_PROJECTION,?null,?null,??????????????????Conversation.CONVERSATION_ORDER);??????}????????????private?final?class?ConversationQuery?extends?AsyncQueryHandler?{????????????public?ConversationQuery(ContentResolver?cr)?{??????????????super(cr);??????????????????????}????????????@Override??????????protected?void?onQueryComplete(int?token,?Object?cookie,?Cursor?cursor)?{??????????????????????????System.out.println("conversation?cursor?size?:?"??????????????????????+?cursor.getCount());??????????????mAdapter.changeCursor(cursor);??????????????Toast.makeText(??????????????????????getActivity(),??????????????????????"查詢短信會話個數(shù):"?+?cursor.getCount()?+?",花費"??????????????????????????????+?(System.currentTimeMillis()?-?startTime)?+?"?ms",??????????????????????Toast.LENGTH_LONG).show();??????????}????????}????}?? 代碼中可以知道和使用普通的ListActivity完全沒區(qū)別,
?
onCreate()中完成自己要一次性初始的東西,我在里面主要是初始化一個adapter和一個對sms數(shù)據(jù)庫的查詢
在onActivityCreated()中將adapter設置給listview,這個不確定有沒有更好的位置,
然后進入我們熟悉的生命周期方法:
onStart()中,開啟查詢
onStop()中,我們界面已經(jīng)不在顯示了,所以我們不關心數(shù)據(jù)庫變化了,close cursor
4.主頁面的布局文件:
?
[html]?view plaincopy
<?xml?version="1.0"?encoding="utf-8"?>??<FrameLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:id="@+id/door_root_content_fl"??????android:layout_width="match_parent"??????android:layout_height="match_parent"?>????????<LinearLayout??????????android:layout_width="match_parent"??????????android:layout_height="match_parent"??????????android:orientation="vertical"?>????????????<FrameLayout??????????????android:id="@+id/door_contents_fl"??????????????android:layout_width="match_parent"??????????????android:layout_height="0dp"??????????????android:layout_weight="1"?/>????????????<LinearLayout??????????????android:layout_width="match_parent"??????????????android:layout_height="55dp"??????????????android:orientation="horizontal"?>????????????????<Button??????????????????android:id="@+id/door_menu_btn"??????????????????android:layout_width="match_parent"??????????????????android:layout_height="match_parent"??????????????????android:gravity="center"??????????????????android:text="菜單"?/>??????????</LinearLayout>??????</LinearLayout>????</FrameLayout>?? 5.運行效果圖:
?
轉載于:https://www.cnblogs.com/wikiki/p/4318696.html
總結
以上是生活随笔為你收集整理的转 Fragment 和 FragmentActivity的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。