fragment簡單有用的一些細節

水的川發表於2016-04-20

          android開發非常熟悉的一個用來展示介面的碎片,在我們操作fragment的過程當中,需要注意許許多多的細節,下面就來分享下我遇到的一些細節上的東西。

       1.fragment是依附於activity的,但是有自己的生命週期,其中它和activity一樣都有生命週期的onresume()方法,我們要注意當我們想執行fragment的onresume的方法時,必定會先執行activity中的onresume方法,還會同樣執行所有依附於這個activity的fragment中的onresume方法。

        2.fragment中我們經常會呼叫資原始檔中的一些資源,一般都是沒有問題的,但是有些時候當你切換fragment太快的時候會發現程式奔潰了,這是為什麼呢?一看你發現自己呼叫資原始檔的時候是放線上程中比如說是需要網路請求耗時操作返回的方法裡,此時你的fragment已經從activity中remove掉了,再使用getresource()方法得到的是空,然後調資原始檔出現空指標錯誤。解決方案有兩種一種是直接在呼叫前判斷if(added()),是否已經新增到activity中,另一種是將獲取資原始檔的操作放到非延時操作裡後將值先存到一個變數裡。

       3.說下我在android studio中遇到的坑吧,當時我想除錯下程式碼,然後在onhiddenchanged()方法中打了個斷點,在切換fragment的時候,發現斷點老是進不來,我以為是onhiddenchange()方法沒有執行,但是我用的是常用的add,hide,show方法進行切換,每次切換都會執行onhiddenchanged()方法,原來是as自帶的坑,那個斷點邊成了一個叉,表示執行過了,但是沒有debug成功,你要rebuild專案或者說重啟下as就能debug成功了。。。當時查出時已淚崩。。

      4.這是我們經常用到的fragment切換方法,然後很多時候我們需要在hide,或者show這個fragment的時候執行一些操作,這時候你就可以在fragment的父類裡面(經常都有個父類比如說basefragment來放一些fragment共有的操作),寫一個抽象方法,比如說在transaction.hide(hideFragment);前寫mCurrentFragment.beforeHide();當然父類裡面要有beforeHide()這個方法,這樣在有需要的時候子類fragment只要繼承就好了。

//不為空的話隱藏

if (hideFragment !=null) {

transaction.hide(hideFragment);

}

//已經新增的話顯示

if (startFragment.isAdded()) {

transaction.show(startFragment);

//第一次新增,並儲存tagKey(Fragment類名),可以用getSupportFragmentManager()直接根據tagKey名取出該Fragment進行操作

} else {

transaction.add(R.id.container, startFragment, tagKey);

}

transaction.commitAllowingStateLoss();

      這是我感覺fragment中一些比較有用的tips,今天晚上突然想寫寫這好久沒寫的部落格,希望對大家有所幫助。。

相關文章