Fragment相關(guān)

主要內(nèi)容:Fragment簡介伙狐、Fragment的生命周期、Fragment通信贷屎、兩個(gè)Fragment的跳轉(zhuǎn)

Fragment簡介

Fragment出現(xiàn)的初衷是為了適應(yīng)平板唉侄,通過Fragment對UI進(jìn)行模塊化的管理,然后根據(jù)不用的屏幕尺寸動(dòng)態(tài)的更新界面属划。Fragment必須被嵌入到Activity中使用同眯,雖然也擁有自己的生命周期,但是其生命周期受到它所在的Activity的控制须蜗。只有Activity處于活動(dòng)狀態(tài)唠粥,我們才能操作Fragment。

一大莫、Fragment的使用

  1. 創(chuàng)建一個(gè)類繼承自Fragment或者其子類(DialogFragment官份、ListFragment、PreferenceFragment或者WebViewFragment)舅巷。然后實(shí)現(xiàn)其中的一些方法:onCreate()钠右、onCreateView()、onStart()飒房、onResume()狠毯、onPause()、onStop()等嚼松。看實(shí)例:
public class fragment_1 extends Fragment {
    public void fragment_1(){    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment_1, container,false);
        return  rootView;
    }
}

2.使用Fragment有兩種方式

  • 靜態(tài)使用:把創(chuàng)建出來的Fragment作為一個(gè)控件來使用寝受。直接看代碼:
    <fragment
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:name="com.example.wly.fragmentdetail.fragment_1"
        />
    
  • 動(dòng)態(tài)使用:
getSupportFragmentManager()
   .beginTransaction()
   .add(R.id.aty_main, new fragment_1())
   .commit();

二很澄、Fragment相關(guān)的常用方法

Fragment是通過FragmentManager來管理的,我們可以通過getFragmentManager()來獲得它的實(shí)例。在Activity中器予,我們可以動(dòng)態(tài)的添加乾翔、刪除、替換以及執(zhí)行其他動(dòng)作反浓。這樣的每一個(gè)動(dòng)作叫做一個(gè)事務(wù)雷则。需要通過FragmentTransaction來執(zhí)行。

  1. 常用的三個(gè)類

Fragment 在android.app下和android.support.v4.app.都有對應(yīng)類月劈。所以引用的時(shí)候不同文件下的引用文件要一直猜揪,不然會(huì)有問題。

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;

2.常用API
獲取所在的Activity: getActivity()
獲取Fragment:Activity可以調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()方法
獲取FragmentManager: getFragmentManager() // v4中腊凶,getSupportFragmentManager()
FragmentTransaction:fragmentManager.beginTransaction()
ps:下面的一下API是FragmentTransaction中的拴念。
FragmentTransaction transaction = fm.benginTransatcion();//開啟一個(gè)事務(wù)
**transaction.add() **
往Activity中添加一個(gè)Fragment
**transaction.remove() **
從Activity中移除一個(gè)Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧后面會(huì)詳細(xì)說)划煮,這個(gè)Fragment實(shí)例將會(huì)被銷毀缔俄。
transaction.replace()
使用另一個(gè)Fragment替換當(dāng)前的器躏,實(shí)際上就是remove()然后add()的合體~
transaction.hide()
隱藏當(dāng)前的Fragment登失,僅僅是設(shè)為不可見挖炬,并不會(huì)銷毀
transaction.show()
顯示之前隱藏的Fragment
detach()
會(huì)將view從UI中移除,和remove()不同,此時(shí)fragment的狀態(tài)依然由FragmentManager維護(hù)。
attach()
重建view視圖馅巷,附加到UI上并顯示草姻。
transition.addToBackStack(null);
把當(dāng)前的Fragment添加到返回棧中
transatcion.commit()
做了上面一些列操作當(dāng)然需要把這個(gè)事務(wù)提交了,因?yàn)樯厦嬉呀?jīng)交代過了敞曹。對Fragment的操作就是一種事務(wù)综膀。
fragmentManager.popBackStack();
當(dāng)前的Fragment出棧。這里需要注意出棧操作是FragmentManager中的方法橄登。

下面是具體使用場合解析從鴻洋_大神拿來的担平!強(qiáng)烈推薦他的博客!其實(shí)我也關(guān)注了他的公眾號面褐,不過好像沒有太多更新取胎!
a、比如:我在FragmentA中的EditText填了一些數(shù)據(jù)匪傍,當(dāng)切換到FragmentB時(shí)觉痛,如果希望會(huì)到A還能看到數(shù)據(jù),則適合你的就是hide和show手蝎;也就是說,希望保留用戶操作的面板钉鸯,你可以使用hide和show邮辽,當(dāng)然了不要使勁在那new實(shí)例,進(jìn)行下非null判斷岩睁。
b揣云、再比如:我不希望保留用戶操作,你可以使用remove(),然后add()翎迁;或者使用replace()這個(gè)和remove,add是相同的效果净薛。
c、remove和detach有一點(diǎn)細(xì)微的區(qū)別痴腌,在不考慮回退棧的情況下燃领,remove會(huì)銷毀整個(gè)Fragment實(shí)例,而detach則只是銷毀其視圖結(jié)構(gòu)剥悟,實(shí)例并不會(huì)被銷毀曼库。那么二者怎么取舍使用呢?如果你的當(dāng)前Activity一直存在慈缔,那么在不希望保留用戶操作的時(shí)候种玛,你可以優(yōu)先使用detach瓤檐。

Fragment生命周期:

一距帅、Fragment的幾種狀態(tài):
與Activity類似括堤,F(xiàn)ragment也有一下幾種狀態(tài):

  • 活動(dòng)狀態(tài):當(dāng)前Fragment位于前臺,可見讥电,可獲得焦點(diǎn)轧抗。
  • 暫停狀態(tài):其他Activity位于前臺,該Fragment可見纠炮,不可獲得焦點(diǎn)灯蝴。
  • 停止?fàn)顟B(tài):不可見,失去焦點(diǎn)耕肩。
  • 銷毀狀態(tài):該Fragment被完全刪除或被結(jié)束问潭。

二、Fragment的一些生命周期方法:
在Fragment的生命周期中梳虽,有一下方法會(huì)被回調(diào):

  • onAttach():當(dāng)Fragment被添加到Activity時(shí)被回調(diào)灾茁,只回調(diào)一次删顶。
  • onCreate(Bundle savedStatus):創(chuàng)建Fragment時(shí)被回調(diào),一次逗余。
  • onCreateView(): 每次創(chuàng)建、繪制該Fragment的View組件時(shí)回調(diào)腻格,F(xiàn)ragment將會(huì)顯示該方法返回的View組件菜职。
  • onActivityCreated():Fragment所在的Activity啟動(dòng)完成后回調(diào)。
  • onStart():每次啟動(dòng)或恢復(fù)Fragment時(shí)被回調(diào)蜜另。
  • onResume():每次啟動(dòng)或恢復(fù)Fragment時(shí)被回調(diào)嫡意,onStart()回調(diào)后就會(huì)回調(diào)此方法。
  • onPause():暫停時(shí)回調(diào)此迅。
  • onStop():停止Fragment時(shí)回調(diào)旧巾。
  • onDestroyView():銷毀Fragment的View組件時(shí)回調(diào)鲁猩。
  • onDestroy():銷毀Fragment時(shí)調(diào)用,一次绳匀。
  • onDetach():將Fragment從Activity中刪除疾棵、被替換完成時(shí)回到該方法痹仙,在onDestroy()之后回調(diào)。

三拟枚、Fragment生命周期與Activity的生命周期交叉:

這是補(bǔ)充:onCreateView()的作用是初始化Fragment的一些視圖控件恩溅,然后把Fragment視圖返回給Activity谓娃。如果在Fragment中用到了Activity的一些控件或者變量,需要在onActivityCreated()中通過getActivity()方法來取得所在的Activity奶稠,然后獲取需要的變量,此時(shí)都已初始化完成竹握。

四辆飘、Fragment傳遞參數(shù)

  1. Fragment與Activity之間的參數(shù)傳遞,有兩種方式:
  • 在Fragment中通過getActivity()的方法可以獲得所在的Activity昧甘,然后就可以獲取其中的數(shù)據(jù)甚至修改其中的數(shù)據(jù)战得。
  • 通過Bundle傳值
    在Activity中:
AnotherFragment anotherFragment = new AnotherFragment();
Bundle bundle = new Bundle();
bundle.putString("data", "MainActivity 2 anotherFragment常侦!");
anotherFragment.setArguments(bundle);

getSupportFragmentManager().beginTransaction()
            .add(R.id.one, anotherFragment, "another")
            .commit();

接收參數(shù):

Bundle bundle = getArguments();
Toast.makeText(getActivity(), bundle.getString("data"), Toast.LENGTH_LONG).show();

也可以通過接口回調(diào)的形式,給Activity回傳
在Fragment中聲明接口變量肘习,然后在Activity中實(shí)現(xiàn)接口坡倔。在Fragment的onViewCreated()方法中給對應(yīng)的接口變量賦值為對應(yīng)的Activity罪塔。并調(diào)用接口實(shí)現(xiàn)方法,把參數(shù)通過接口方法回傳回去瘩缆。

五佃蚜、兩個(gè)Fragment之間的跳轉(zhuǎn)
1.從Fragment到Activity的跳轉(zhuǎn),直接看代碼熟尉,和Activity的跳轉(zhuǎn)沒有太大區(qū)別:

Intent intent = new Intent(getActivity(), LoginActivity.class);
startActivity(intent);

2.從Fragment到Fragment的跳轉(zhuǎn):

LoginFragment loginFg = new LoginFragment();
getFragmentManager()
        .beginTransaction()
        .replace(R.id.main_layout, loginFg, "LoginFragment")
        .addToBackStack(null)
        .commit();

這里需要注意addToBackStack(null)這個(gè)方法洲脂,假如不把前一個(gè)Fragment放到后退棧中,那么這個(gè)Fragment就會(huì)被銷毀雇毫。放進(jìn)去,一般情況下不會(huì)被銷毀(內(nèi)存緊張的情況下可能會(huì)銷毀)枚粘。

結(jié)束語:這里總結(jié)了一下Fragment的基本用法馍迄,其實(shí)關(guān)于FragmentManager局骤,還有相關(guān)的replace、add等方法都需要去深究赘来,翻一翻源碼凯傲。但是現(xiàn)在首要任務(wù)是會(huì)用這些東西,然后去找一份工作幌缝。那些東西還是需要具體用的時(shí)候去深究诫欠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荒叼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伊者,老刑警劉巖间护,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汁尺,死亡現(xiàn)場離奇詭異,居然都是意外死亡搂蜓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門相味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丰涉,“玉大人斯碌,你說我怎么就攤上這事⊥洞龋” “怎么了策吠?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵猴抹,是天一觀的道長。 經(jīng)常有香客問我蝙砌,道長跋理,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮拭卿,結(jié)果婚禮上峻厚,老公的妹妹穿的比我還像新娘。我一直安慰自己惠桃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布罐孝。 她就那樣靜靜地躺著懈息,像睡著了一般辫继。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姑宽,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天炮车,我揣著相機(jī)與錄音,去河邊找鬼纪隙。 笑死扛或,一個(gè)胖子當(dāng)著我的面吹牛熙兔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播麸锉,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼花沉,長吁一口氣:“原來是場噩夢啊……” “哼媳握!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毙芜,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忽媒,失蹤者是張志新(化名)和其女友劉穎争拐,沒想到半個(gè)月后腋粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晦雨,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年隘冲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闹瞧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡展辞,死狀恐怖奥邮,靈堂內(nèi)的尸體忽然破棺而出罗珍,到底是詐尸還是另有隱情洽腺,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布覆旱,位于F島的核電站蘸朋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扣唱。R本人自食惡果不足惜藕坯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望噪沙。 院中可真熱鬧炼彪,春花似錦、人聲如沸正歼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朋腋。三九已至齐疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旭咽,已是汗流浹背贞奋。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穷绵,地道東北人轿塔。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像仲墨,于是被迫代替她去往敵國和親勾缭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容