拖了好久終於又發布了一篇新的文章...
想想覺得自己實在是太偷懶了哈!
不過這一次真的是收益良多,所以趕緊記錄下來
不知道各位會不會有這種想法:不想將重複的程式碼一直加入到程式當中
在寫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當中的參數,主要是為了將你的App在背景執行時,倘若被回收掉記憶體,仍然能保持先前的樣子,包含Fragment
因此,在第一次使用Fragment Add的時候 才會需要這樣判斷,當savedInstanceState為null的時候 才進行Add
把Fragment加入到Activity中 其餘都採用Replace去做更換。
如此一來,不僅記憶體回收時可以保持先前的樣子,而我們所想要達到的目的封裝成類別使用也同時成功了。
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教:)
有任何家教、案子 或技術相關問題 請都歡迎聯繫我