0%

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

前言

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

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

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

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

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

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

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

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

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

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

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

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

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

我們寫了這樣的程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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來將我們的切換頁面函數來進行呼叫。

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

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

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

這時候也許你會問:

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

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

原因在於說:

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

1
2
3
4
5
6
7
8
9
10
@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/