Fragment知識(shí)點(diǎn)詳解

Fragment生命周期

1.png

onAttach(Context context)

onAttach方法會(huì)在Fragment于窗口(Activity)關(guān)聯(lián)后立刻調(diào)用。從該方法開(kāi)始,就可以通過(guò)Fragment.getActivity方法獲取與Fragment關(guān)聯(lián)的窗口對(duì)象苛吱,但因?yàn)镕ragment的控件未初始化,所以不能夠操作控件洲拇。

onCreate(Bundle savedInstanceState)

在調(diào)用完onAttach執(zhí)行完之后立刻調(diào)用onCreate方法焚鲜,可以在Bundle對(duì)象中獲取一些在Activity中傳過(guò)來(lái)的數(shù)據(jù)。通常會(huì)在該方法中讀取保存的狀態(tài)雀费,獲取或初始化一些數(shù)據(jù)干奢。在該方法中不要進(jìn)行耗時(shí)操作,不然窗口不會(huì)顯示盏袄。

onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)

該方法是Fragment很重要的一個(gè)生命周期方法忿峻,因?yàn)闀?huì)在該方法中創(chuàng)建在Fragment顯示的View薄啥,其中inflater是用來(lái)裝載布局文件的,container是<fragment>標(biāo)簽的父標(biāo)簽對(duì)應(yīng)對(duì)象逛尚,savedInstanceState參數(shù)可以獲取Fragment保存的狀態(tài)垄惧,如果未保存那么就為null。

onViewCreated(View view,Bundle savedInstanceState)

Android在創(chuàng)建完Fragment中的View對(duì)象之后黑低,會(huì)立刻回調(diào)該方法赘艳。其種view參數(shù)就是onCreateView中返回的view酌毡,而bundle對(duì)象用于一般用途克握。

onActivityCreated(Bundle savedInstanceState)

在Activity的onCreate方法執(zhí)行完之后,Android系統(tǒng)會(huì)立刻調(diào)用該方法枷踏,表示窗口已經(jīng)初始化完成菩暗,從這一個(gè)時(shí)候開(kāi)始,就可以在Fragment中使用getActivity().findViewById(Id);來(lái)操控Activity中的view了旭蠕。

onStart()

當(dāng)系統(tǒng)調(diào)用該方法的時(shí)候停团,fragment已經(jīng)顯示在ui上,但還不能進(jìn)行互動(dòng)掏熬,因?yàn)閛nResume方法還沒(méi)執(zhí)行完佑稠。

onResume()

該方法為fragment從創(chuàng)建到顯示Android系統(tǒng)調(diào)用的最后一個(gè)生命周期方法,調(diào)用完該方法時(shí)候旗芬,fragment就可以與用戶互動(dòng)了舌胶。

onPause()

fragment由活躍狀態(tài)變成非活躍狀態(tài)執(zhí)行的第一個(gè)回調(diào)方法,通炒裕可以在這個(gè)方法中保存一些需要臨時(shí)暫停的工作幔嫂。如保存音樂(lè)播放進(jìn)度,然后在onResume中恢復(fù)音樂(lè)播放進(jìn)度誊薄。

onStop()

當(dāng)onStop返回的時(shí)候履恩,fragment將從屏幕上消失。

onDestoryView()

該方法的調(diào)用意味著在 onCreateView 中創(chuàng)建的視圖都將被移除呢蔫。

onDestroy()

Android在Fragment不再使用時(shí)會(huì)調(diào)用該方法切心,要注意的是這時(shí)Fragment還和Activity相關(guān)聯(lián)的!并且可以獲得Fragment對(duì)象片吊,但無(wú)法對(duì)獲得的Fragment進(jìn)行任何操作昙衅。

onDetach()

為Fragment生命周期中的最后一個(gè)方法,當(dāng)該方法執(zhí)行完后定鸟,F(xiàn)ragment與Activity不再有關(guān)聯(lián)而涉。

Fragment比Activity多了幾個(gè)額外的生命周期回調(diào)方法

  • onAttach(Activity):當(dāng)Fragment和Activity發(fā)生關(guān)聯(lián)時(shí)使用
  • onCreateView(LayoutInflater, ViewGroup, Bundle):創(chuàng)建該Fragment的視圖
  • onActivityCreate(Bundle):當(dāng)Activity的onCreate方法返回時(shí)調(diào)用
  • onDestoryView():與onCreateView相對(duì)應(yīng),當(dāng)該Fragment的視圖被移除時(shí)調(diào)用
  • onDetach():與onAttach相對(duì)應(yīng)联予,當(dāng)Fragment與Activity關(guān)聯(lián)被取消時(shí)調(diào)用

注意:除了onCreateView啼县,其他的所有方法如果你重寫了材原,必須調(diào)用父類對(duì)于該方法的實(shí)現(xiàn)。

Fragment的生命周期和activity的關(guān)系

11.jpg

Fragment與Activity之間的交互

Fragment與Activity之間的交互季眷,一般指的是Activity如何向Fragment傳遞數(shù)據(jù)余蟹。
雖然我們可以自定義一個(gè)帶參數(shù)的Fragment構(gòu)造方法,但并不能用它來(lái)傳遞數(shù)據(jù)子刮。因?yàn)楫?dāng)一個(gè)fragment重新創(chuàng)建的時(shí)候威酒,系統(tǒng)會(huì)再次調(diào)用 Fragment中的默認(rèn)構(gòu)造函數(shù)。 注意這里是默認(rèn)構(gòu)造函數(shù)挺峡,也就是自定義帶參數(shù)的構(gòu)造函數(shù)是不會(huì)被調(diào)用的(fragment重新創(chuàng)建葵孤,比如橫豎屏切換等等)
官方提供的方案:Fragment與Activity之間的交互可以通過(guò)Fragment.setArguments(Bundle args)以及Fragment.getArguments()來(lái)實(shí)現(xiàn)。
如下程序:

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fl_main, FragmentOne.newInstance("params"))
                    .commit();
        }
    }
}
public class FragmentOne extends Fragment{
    private TextView textView;
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, null);
        textView = (TextView) view.findViewById(R.id.textview);
        if(getArguments()!=null){
            //取出保存的值
            textView.setText(getArguments().getString("name"));
        }
        return view;
    }
    public static  FragmentOne newInstance(String text){
        FragmentOne fragmentOne = new FragmentOne();
        Bundle bundle = new Bundle();
        bundle.putString("name", text);
        //fragment保存參數(shù)橱赠,傳入一個(gè)Bundle對(duì)象
        fragmentOne.setArguments(bundle);
        return fragmentOne;
    }
}

Fragment狀態(tài)的持久化

方法一:onSaveInstanceState尤仍、onRestoreInstanceState

可以通過(guò)protected void onSaveInstanceState(Bundle outState),protected void onRestoreInstanceState(Bundle savedInstanceState) 狀態(tài)保存和恢復(fù)的方法將狀態(tài)持久化

方法二:將Fragment在Activity中作為一個(gè)變量整個(gè)保存

FragmentManager.putFragment(Bundle bundle, String key, Fragment fragment) 是在Activity中保存Fragment的方法。
FragmentManager.getFragment(Bundle bundle, String key) 是在Activity中獲取所保存的Frament的方法狭姨。
注意:FragmentManager是通過(guò)Bundle去保存Fragment的宰啦。這個(gè)方法僅僅能夠保存Fragment中的控件狀態(tài),比如說(shuō)EditText中用戶已經(jīng)輸入的文字(注意饼拍!在這里赡模,控件需要設(shè)置一個(gè)id,否則Android將不會(huì)為我們保存控件的狀態(tài))师抄,而Fragment中需要持久化的變量依然會(huì)丟失漓柑,但依然有解決辦法,就是利用方法一司澎。

狀態(tài)持久化的事例代碼

Activity中的代碼

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_activity);

        if( savedInstanceState != null ){
            fragmentB = (FragmentB) getSupportFragmentManager().getFragment(savedInstanceState,"fragmentB");
        }

        init();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if( fragmentB != null ){
            getSupportFragmentManager().putFragment(outState,"fragmentB",fragmentB);
        }
        super.onSaveInstanceState(outState);
    }

Fragment中保存變量的代碼

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        AppLog.e("onCreateView");
        if ( null != savedInstanceState ){
            String savedString = savedInstanceState.getString("string");
            //得到保存下來(lái)的string
        }
        View root = inflater.inflate(R.layout.fragment_a,null);
        return root;
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putString("string","anAngryAnt");
        super.onSaveInstanceState(outState);
    }

Fragment常用的API

  • android.support.v4.app.Fragment 主要用于定義Fragment(向下兼容至SDK11欺缘,即Android3.0)
  • android.support.v4.app.FragmentManager 主要用于在Activity中操作Fragment,可以使用FragmentManager.findFragmenById挤安,F(xiàn)ragmentManager.findFragmentByTag等方法去找到一個(gè)Fragment
  • android.support.v4.app.FragmentTransaction谚殊,對(duì)fragment進(jìn)行添加,移除,替換,以及執(zhí)行其他動(dòng)作,必須調(diào)用commit才能生效
  • getFragmentManager()蛤铜,主要的操作都是FragmentTransaction的方法嫩絮,F(xiàn)ragment若使用的是support.v4包中的,那就使用getSupportFragmentManager代替

管理Fragment回退棧

跟蹤回退棧狀態(tài)

通過(guò)實(shí)現(xiàn) OnBackStackChangedListener 接口來(lái)實(shí)現(xiàn)回退棧狀態(tài)跟蹤

public class XXX implements FragmentManager.OnBackStackChangedListener 
/** 實(shí)現(xiàn)接口所要實(shí)現(xiàn)的方法 **/
@Override
public void onBackStackChanged() {
    //do whatevery you want
}
/** 設(shè)置回退棧監(jiān)聽(tīng)接口 **/
getSupportFragmentManager().addOnBackStackChangedListener(this);

管理回退棧的相關(guān)方法

  • FragmentTransaction.addToBackStack(String) --將一個(gè)剛剛添加的Fragment加入到回退棧中
  • getSupportFragmentManager().getBackStackEntryCount() -獲取回退棧中實(shí)體數(shù)量
  • getSupportFragmentManager().popBackStack(String name, int flags) -根據(jù)name立刻彈出棧頂?shù)膄ragment
  • getSupportFragmentManager().popBackStack(int id, int flags) -根據(jù)id立刻彈出棧頂?shù)膄ragment

用Fragment同時(shí)適配手機(jī)和平板兩種屏幕

http://blog.csdn.net/guolin_blog/article/details/8744943

參考

https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Fragment.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末围肥,一起剝皮案震驚了整個(gè)濱河市剿干,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穆刻,老刑警劉巖置尔,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氢伟,居然都是意外死亡榜轿,警方通過(guò)查閱死者的電腦和手機(jī)幽歼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谬盐,“玉大人甸私,你說(shuō)我怎么就攤上這事》煽” “怎么了皇型?”我有些...
    開(kāi)封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)砸烦。 經(jīng)常有香客問(wèn)我弃鸦,道長(zhǎng),這世上最難降的妖魔是什么外冀? 我笑而不...
    開(kāi)封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任寡键,我火速辦了婚禮掀泳,結(jié)果婚禮上雪隧,老公的妹妹穿的比我還像新娘。我一直安慰自己员舵,他們只是感情好脑沿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著马僻,像睡著了一般庄拇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上韭邓,一...
    開(kāi)封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天措近,我揣著相機(jī)與錄音,去河邊找鬼女淑。 笑死瞭郑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸭你。 我是一名探鬼主播屈张,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袱巨!你這毒婦竟也來(lái)了阁谆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愉老,失蹤者是張志新(化名)和其女友劉穎场绿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嫉入,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰盗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年贱鄙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姨谷。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逗宁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梦湘,到底是詐尸還是另有隱情瞎颗,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布捌议,位于F島的核電站哼拔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瓣颅。R本人自食惡果不足惜倦逐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宫补。 院中可真熱鬧檬姥,春花似錦、人聲如沸粉怕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贫贝。三九已至秉犹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稚晚,已是汗流浹背崇堵。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留客燕,地道東北人鸳劳。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幸逆,于是被迫代替她去往敵國(guó)和親棍辕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • Fragment概述 Fragment是Activity中用戶界面的一個(gè)行為或者說(shuō)是一部分还绘。主要是支持大屏幕上動(dòng)態(tài)...
    wangling90閱讀 11,536評(píng)論 5 75
  • 引言:這篇文章拍顷,大概分析下Fragment的生命周期抚太、實(shí)際應(yīng)用方法以及使用Fragment時(shí)需要注意的地方,算是F...
    androidjp閱讀 12,876評(píng)論 10 104
  • Fragment 介紹 為何產(chǎn)生 同時(shí)適配手機(jī)和平板、UI和邏輯的共享尿贫。 介紹 Fragment也會(huì)被加入回退棧中...
    geaosu閱讀 306評(píng)論 0 0
  • Fragment 為何產(chǎn)生 同時(shí)適配手機(jī)和平板电媳、UI和邏輯的共享。 介紹 Fragment也會(huì)被加入回退棧中庆亡。 F...
    程慕楓閱讀 409評(píng)論 1 0
  • 孤獨(dú)是常態(tài)匾乓,終究要學(xué)會(huì)一個(gè)人去面對(duì)世界。 人總會(huì)長(zhǎng)大又谋,雛鷹總會(huì)離巢拼缝。出門在外的日子,一開(kāi)始總是新鮮彰亥,沒(méi)有了父母的管...
    斯文歧一閱讀 197評(píng)論 0 0