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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android_Fragment_Fragment详解

發布時間:2024/4/14 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android_Fragment_Fragment详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?

Android_Fragment_Fragment詳解

分類:?Android基礎 AndroidFragmentFragmentManagerFragmentTransaction生命周期

目錄(?)[+]

本博文為子墨原創,轉載請注明出處! http://blog.csdn.net/zimo2013/article/details/12239349

1.Fragment概述

在一個Activity中, Fragment代表UI的一個部分或者一個行為。一個Activity可以結合多個Fragment對象,也可以在多個activity中使用相同Fragment字節碼對應的不同對象。一個Fragment對象必須被嵌入在一個主Activity對象中,該Fragment的生命周期與主Activity息息相關。比如,當主Activity處于paused狀態,其對應的所有Fragment對象均處于paused狀態,只有當主Activity處于resumed狀態時,Fragment才能處于自由控制狀態。

2.創建Fragment

為了創建一個Fragment,應該去繼承Fragment或者其子類,覆寫相應的方法。比如onCreate(),OnCreateView(),onPause()等等

(1).添加UI界面

為該Fragment展現一個布局,必須去實現onCreateView()回掉方法。
注意:當該Fragment繼承了ListFragment時,不需要覆寫onCreateView()方法,因為默認返回一個ListView對象

[java]?view plaincopy
  • public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??
  • ????????Bundle?savedInstanceState)?{??
  • ????View?view?=?inflater.inflate(R.layout.list,?null);??
  • ????return?view;??
  • }??
  • (2).添加Fragment到Activity

    1).通過layout布局文件

    android:name屬性應該為Fragment對應類的完整路徑。

    [html]?view plaincopy
  • <?xml?version="1.0"?encoding="utf-8"?>??
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????android:layout_width="match_parent"??
  • ????android:layout_height="match_parent"??
  • ????android:orientation="horizontal"?>??
  • ??
  • ????<fragment??
  • ????????android:id="@+id/list"??
  • ????????android:name="com.example.news.ArticleListFragment"??
  • ????????android:layout_width="0dp"??
  • ????????android:layout_height="match_parent"??
  • ????????android:layout_weight="1"?/>??
  • ????<fragment??
  • ????????android:id="@+id/viewer"??
  • ????????android:name="com.example.news.ArticleReaderFragment"??
  • ????????android:layout_width="0dp"??
  • ????????android:layout_height="match_parent"??
  • ????????android:layout_weight="2"?/>??
  • ??
  • </LinearLayout>??
  • 2).通過Java代碼

    當Activity運行時,可以自由的在該activity上添加fragment對象,但應該指定一個ViewGroup容器,可以FragmentTransaction完成fragment的添加移除或者替換。

    [java]?view plaincopy
  • manager?=?getFragmentManager();??
  • if(manager.findFragmentByTag("right")?==?null){??
  • ????manager.beginTransaction().replace(R.id.right,?new?RightFrag(),?"right").commit();??
  • }??
  • (3).fragment唯一標示符

    每個fragment需要定義一個唯一的標識符,如果activity被銷毀又重新啟動,系統能夠恢復該fragment的狀態。如果想重新恢復,需滿足下面有3種方式之一:

    1).定義ID

    在布局文件中,定義android:id屬性

    [html]?view plaincopy
  • <fragment??
  • ????android:id="@+id/list"??
  • ????android:name="com.example.news.ArticleListFragment"??
  • ????android:layout_width="0dp"??
  • ????android:layout_height="match_parent"??
  • ????android:layout_weight="1"?/>??
  • 2).指明tag

    android:tag 指明 或者 一個fragment對象add()或者replace()時指定tag

    [html]?view plaincopy
  • <fragment??
  • ????android:id="@+id/list"??
  • ????android:tag="first"??
  • ????android:name="com.example.news.ArticleListFragment"??
  • ????android:layout_width="0dp"??
  • ????android:layout_height="match_parent"??
  • ????android:layout_weight="1"?/>??
  • 或者

    [java]?view plaincopy
  • manager.beginTransaction()??
  • ????.replace(R.id.right,?new?RightFrag(),?"right")//在事務中指明該fragment的tag??
  • .commit();??
  • 3).viewgroup ID

    如果該fragment均沒有id和tag,系統將使用container view布局的id

    3.Fragment的管理

    通過getFragmentManager()方法,可以得到FragmentManager對象,主要完成下面的功能

    [java]?view plaincopy
  • FragmentManager?manager?=?getFragmentManager();??
  • (1).得到已經存在Fragment對象

    如果該fragment在布局文件中指定了id,通過findFragmentById()得到對象,或者指定了tag可以通過findFragmentByTag()得到對象

    [java]?view plaincopy
  • Fragment?fragment?=?getFragmentManager().findFragmentByTag("right");??
  • //or??
  • Fragment?fragment?=?getFragmentManager().findFragmentById(id);??
  • (2).注冊OnBackStackChangedListener監聽器

    可以用來監聽該任務對應的返回棧信息,當該返回棧狀態發生改變時,執行對應的onBackStackChanged() 方法

    [java]?view plaincopy
  • manager.addOnBackStackChangedListener(new?FragmentManager.OnBackStackChangedListener()?{??
  • ????@Override??
  • ????public?void?onBackStackChanged()?{??
  • ????????Toast.makeText(MainActivity.this,?"返回堆狀態發生改變",?1).show();??
  • ????}??
  • });??
  • (3).彈出返回棧

    模擬用戶點擊返回鍵,將指定的fragment從返回棧中彈出,該操作為異步的。前提是該fragment對象使用.beginTransaction().addToBackStack("right")添加了進返回棧

    [java]?view plaincopy
  • manager.popBackStack();?//Pop?the?top?state?off?the?back?stack??
  • (4).FragmentTransaction事務

    事務主要包含一些操作的集合,比如增加移除替換,動畫設置等等

    [html]?view plaincopy
  • /*??
  • ?*?通過manager開啟一個事務,該事務包含一些操作的集合,通事務可以?add(),?remove(),?replace()??
  • ?*?完成對Fragment的操作,并使用commit()提交??
  • ?*/??
  • FragmentTransaction?transaction?=?manager.beginTransaction();??
  • ??
  • transaction.replace(R.id.right,?new?RightFrag(),?"right");??
  • transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//設置動畫??
  • transaction.addToBackStack("right");?//?將該fragment加入返回堆??
  • //?提交事務??
  • transaction.commit();??
  • (5).Fragment狀態管理

    [java]?view plaincopy
  • /*?
  • ?*?管理Fragment的狀態?
  • ?*??如果在一個主activityViewGroup中添加一個fragment,?
  • ?*??如果手機屏幕旋轉了,當前activity被銷毀重建,fragment也被activityManager創建?
  • ?*??故在onCreate中,需要判斷一下?
  • ?*/??
  • @Override??
  • protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????super.onCreate(savedInstanceState);??
  • ????setContentView(R.layout.activity_main);??
  • ????manager?=?getFragmentManager();??
  • ????if?(manager.findFragmentByTag("right")?==?null)?{??
  • ????????//?if(savedInstanceState?==?null)也可判斷該fragment是否已經加載??
  • ??
  • ????????manager.beginTransaction()??
  • ????????????.replace(R.id.right,?new?RightFrag(),?"right")??
  • ????????????.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)//?設置動畫??
  • ????????????.addToBackStack("right")?//?將該fragment加入返回堆??
  • ????????//?提交事務??
  • ????????.commit();??
  • ????}??
  • }??
  • 4.Fragment間信息交互

    (1).取得對象

    [java]?view plaincopy
  • /*?
  • ?*?點擊該Fragment的button按鈕,將該button的text設置為另一個fragment中Edittext的文本值?
  • ?*/??
  • public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??
  • ????????Bundle?savedInstanceState)?{??
  • ????View?view?=?inflater.inflate(R.layout.list,?null);??
  • ????final?Button?button?=?(Button)?view.findViewById(R.id.confirm);??
  • ????button.setOnClickListener(new?View.OnClickListener()?{??
  • ??????????
  • ????????@Override??
  • ????????public?void?onClick(View?v)?{??
  • ????????????//通過FragmentManager找到另一個fragment中的edittext對象,并取得text內容??
  • ????????????EditText?editText?=?(EditText)(getFragmentManager().findFragmentByTag("left").getView().findViewById(R.id.name));??
  • ????????????button.setText(editText.getText().toString());??
  • ????????}??
  • ????});??
  • ????return?view;??
  • }??
  • ?(2).通回掉函數

    [java]?view plaincopy
  • public?class?MainActivity?extends?Activity?{??
  • ????private?FragmentManager?manager;??
  • ????private?Button?button;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??????????
  • ????????button.setOnClickListener(new?View.OnClickListener()?{??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????RightFragment?rightFrag?=?(RightFragment)?(getFragmentManager().findFragmentByTag("right"));??
  • ????????????????/*?
  • ?????????????????*?通過set方法,向其傳遞一個實例化對象,由于rightFrag.set()方法內部執行RightFragment.CallBack.get()方法,完成了參數的傳遞?
  • ?????????????????*/??
  • ????????????????rightFrag.set(new?RightFragment.CallBack()?{??
  • ????????????????????@Override??
  • ????????????????????public?void?get(String?str)?{??
  • ????????????????????????button.setText(str);??
  • ????????????????????}??
  • ????????????????});??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??
  • }??
  • [java]?view plaincopy
  • public?class?RightFragment?extends?ListFragment?{??
  • ????private?LoaderManager?manager;??
  • ??
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????manager?=?getLoaderManager();??
  • ????}??
  • ??
  • ????/*?
  • ?????*?點擊該Fragment的button按鈕,將該button的text設置為另一個fragment中Edittext的文本值?
  • ?????*/??
  • ????public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??
  • ????????????Bundle?savedInstanceState)?{??
  • ????????View?view?=?inflater.inflate(R.layout.list,?null);??
  • ????????return?view;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?通過調用該方法,接收一個回掉函數對象,callBack.get(str);?
  • ?????*?@param?callBack?
  • ?????*/??
  • ????public?void?set(CallBack?callBack)?{??
  • ????????EditText?editText?=?(EditText)?getView().findViewById(R.id.name);??
  • ????????callBack.get(editText.getText().toString());??
  • ????}??
  • ??
  • ????/*?
  • ?????*?回掉接口?
  • ?????*/??
  • ????interface?CallBack?{??
  • ????????public?void?get(String?str);??
  • ????}??
  • }??
  • 5.Fragment的生命周期

    (1).生命周期路線圖

    生命狀態

    周期過程

    ?

    foreground lifetime

    onResume(A)

    onResume(F)

    onPause(F)

    onPause(A)

    visible lifetime

    onCreateView(F)

    onActivityCreated(F)

    onStart(A)

    onStart(F)

    onResume(A)

    onResume(F)

    onPause(F)

    onPause(A)

    onStop(F)

    onStop(A)

    onDestroyView(F)

    entire lifetime

    完整的生命周期

    ?(2).生命周期回掉函數概述

    方法描述
    onAttach(Activity)

    當前Fragment與Activity關聯,調用!

    onCreate()

    完成fragment的初始化創建

    ?onCreateView()

    創建并返回與當前fragment相關聯的層次視圖view

    ?onActivityCreated()

    主activity的onCreate()執行完后,該方法才執行

    ?onStart()

    fragment可見,當主activity處于started狀態后執行

    ??onResume()

    fragment能與用戶交互,當主activity處于resumed狀態后執行

    ??onPause()

    fragment不在與用戶交互,可能在主activity將要處于paused前執行,可能該fragment被修改

    ?onStop()

    fragment不在可見,可能在主activity將要處于stopped前執行,可能該fragment被修改

    ?onDestroyView()

    允許該fragment清理視圖相關資源

    onDestroy()

    清理掉視圖state信息

    onDetach()

    該fragment不在于activity關聯

    ?

    總結

    以上是生活随笔為你收集整理的Android_Fragment_Fragment详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。