Android - 封裝Fragment當中換頁的程式碼

拖了好久終於又發布了一篇新的文章...

想想覺得自己實在是太偷懶了哈!

不過這一次真的是收益良多,所以趕緊記錄下來

不知道各位會不會有這種想法:不想將重複的程式碼一直加入到程式當中

在寫Android當中,我個人認為Fragment是一個很棒的東西,因為它可以將你的App挖出一塊空間出來,來讓你的Fragment Layout來進行切換

但是,在切換的過程當中,往往切換頁面的程式碼都需要進行重複的撰寫。

因此筆者一直在思考,要如何做到只寫一次,就可以持續的做切換

因此就想出了可以直接將切換頁面的程式碼進行封裝

利用靜態方法,讓底下的這串切換程式碼的功能能夠進行覆用

 FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace("欲切換的頁面");
        transaction.commit();

但當你寫完後,你會發現.... Error!!

他會告訴你,你的靜態方法Change當中,包含了非靜態的方法「getFragmentManager()」

那...該怎麼辦?難道就註定無法將程式碼進行重複使用嗎?

在跟高手討論過後,既然山不轉,就路轉

我們一樣宣告成靜態函數,但是這次呢,我們將參數全部由我們的MainActivity來進行傳送

因此在我們封裝的這個類別 FragmentManagerTool 當中

我們寫了這樣的程式碼

public class FragmentManagerTool {

    /* initial Fragment */
    public static void init(Bundle savedInstanceState, FragmentManager fragmentManager, int layoutID, Fragment fragment) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        if (savedInstanceState == null) {
            transaction.add(layoutID, fragment).commit();
        }
    }

    /* replace Fragment */
    public static void replaceFragment(FragmentManager fragmentManager, int layout, Fragment f) {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        ft.replace(layout, f);
        ft.commit();
    }
}

我們將參數由外面的Activity來進行傳入,如此一來就可以透過static來將我們的切換頁面函數來進行呼叫。

這時候外面只需要這樣撰寫就可以了:

FragmentManagerTool.init(savedInstanceState,getSupportFragmentManager(),R.id.content,ViewList.Instance());

這樣的做法是不是很方便呢?

這時候也許你會問:

為什麼會需要有init 這個方法?

不是只需要將頁面進行replace就好了嗎?為什麼在 init() 當中,會用到Add()的方法呢?

原因在於說:

各位有沒有發現到在MainActivity當中的OnCreate()當中,有著這樣的一段Code:


    @Override
    protected void onCreate(Bundle savedInstanceState /*What this?*/) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //頁面切換
        FragmentManagerTool.init(savedInstanceState,getSupportFragmentManager(),R.id.content,ViewList.Instance());
        
    }

 

各位會發現到,在你的OnCreate當中有一個Bundle類別的參數  savedInstanceState

這是什麼呢?我們查閱了官網的解釋,有興趣的可以點選連結進行查閱: 

文件上說明了:「 savedInstanceState Always都會是null,直到在背景執行記憶體回收時,savedInstanceState 會保存你上一次的Activity」

 也就是說,在OnCreate當中的參數,主要是為了將你的App在背景執行時,倘若被回收掉記憶體,仍然能保持先前的樣子,包含Fragment

因此,在第一次使用Fragment Add的時候 才會需要這樣判斷,當savedInstanceState為null的時候 才進行Add
把Fragment加入到Activity中 其餘都採用Replace去做更換。

如此一來,不僅記憶體回收時可以保持先前的樣子,而我們所想要達到的目的封裝成類別使用也同時成功了。

 

以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教:)

有任何家教、案子 或技術相關問題 請都歡迎聯繫我

http://www.zhenghui.idv.tw/