日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转 Fragment 和 FragmentActivity的使用

發(fā)布時間:2024/9/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转 Fragment 和 FragmentActivity的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天學習下 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)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????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)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????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)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????showFragments(FRAG_TEXT,?true);??
  • ????????????}??
  • ????????});??
  • ????????mMenuBtn.setOnLongClickListener(new?OnLongClickListener()?{??
  • ??????????????
  • ????????????@Override??
  • ????????????public?boolean?onLongClick(View?v)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ??????????????????
  • ????????????????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)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onCreate(savedInstanceState);??
  • ????????mAdapter?=?new?ConversationListAdapter(getActivity());??
  • ????????mQuery?=?new?ConversationQuery(getActivity().getContentResolver());??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onActivityCreated(Bundle?savedInstanceState)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onActivityCreated(savedInstanceState);??
  • ????????setListAdapter(mAdapter);??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onStart()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onStart();??
  • ????????startAsyncQuery();??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onStop()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????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);??
  • ????????????//?TODO?Auto-generated?constructor?stub??
  • ????????}??
  • ??
  • ????????@Override??
  • ????????protected?void?onQueryComplete(int?token,?Object?cookie,?Cursor?cursor)?{??
  • ????????????//?TODO?Auto-generated?method?stub??
  • ????????????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)站內容還不錯,歡迎將生活随笔推薦給好友。