Android 值Fragment篇
好久沒寫博客了,本來打算是一週寫一遍總結的,但是計劃永遠趕不上變化,前兩週還在學習ndk開發,本週就被公司安排又來開始做android界面的開發了。今天就把我這一週來用到的一個知識點,Fragment和大家分享一下。
1、Fragment允許將Activity拆分成過關完全獨立封裝的可重用組件,每一組件都有他自己的生命週期和ui佈局。我先描述一下我要做的東西,就是在Activity的主界面,做一個界面切換的佈局,如圖
這是我們的效果圖,點擊下面的各個選項,界面可以相互切換,要實現這個功能,可以有很多種方法,如利用viewPager控件,viewpager控件可以實現左右切換,但是下面的這些選項(動態,首頁。。。)等等就不太容易佈局了。也可以單獨爲沒有選項做一個Activity,但是那樣切換的時候,資源消耗過大不說,也容易出現界面切換太明顯的效果,所以我就考慮用Fragment了。
2、Fragment最大的優點就是讓你可以靈活動態的處理界面問題,你可以根據需要,隨意對Fragment進行添加,刪除,和替換,我的這個項目,主要是用了替換。
3、創建一個新的Fragment,可以通過基礎Fragment類來創建一個新的Fragment,在android框架內編程,這都是固定模式了。大多數情況下,需要爲Fragment分配一個ui這就需要重寫onCrateView方法來填充並返回需要的view層次。
這是我的動態Fragment的onCreatView方法,一般在返回佈局前,需要對佈局進行初始化,就像在Activity的onCreate方法裏面做的事一樣。這裏面也會涉及到Fragment的生命週期,其實和Activity也差不多,這裏就不多說了。
4、要對Fragment進行控制,就要有管理Fragment的類,在這裏,android給我們提供了一個FragmentManager類,可以通過Activity的getFragmentManager()方法來的得到這個FragmentManager的對象。而這個FragmentManager就提供了添加,刪除,替換Fragment的方法。
5、爲Activity添加Fragment最簡單的方式是在佈局文件中直接使用Fragment標籤來包含你之前新建的Fragment類就ok了。如圖
當然,在我的項目中我是用了另外一種方式,就是在佈局文件中先放一個Fragment的容器,先佔一個位置,然後在代碼中更具需要,隨意添加,替換那都是你的事。在佈局中的代碼如圖:
這個容器做好了,那就可以在代碼中控制他了。
6、添加,刪除,替換,都用同一個模式就ok了。首先要通過FragmentManager對象得到一個Fragment事務,即FragmentTransaction的對象,通過FragmentTransaction對象,就可以進行添加,刪除,替換了。代碼如下。
// 開啓事務
mFragmentTransaction = mFragmentManager.beginTransaction();
// 添加首頁Fragment
mFragmentTransaction.add(R.id.main_ui_container_framelayout, mDynamicFragment);
// 替換Fragment
mFragmentTransaction.replace(R.id.main_ui_container_framelayout,mDynamicFragment);
//刪除Fragment
mFragmentTransaction.remove(mDynamicFragment);
// 提交事務
mFragmentTransaction.commit();
最後一點要記得提交事務。
7、如果你是在Activity的佈局文件中直接使用Fragment標籤來添加的Fragment,那你就可以再Activity中使用FindFragmentByID這個方法來通過Fragment的資源id來找到這個Fragment,但是,如果你在Activity的佈局文件中使用的是佈局容器,那就只能用findFragmentByTag()這個方法了。這一點主要一下。
8、Fragment和back棧。Fragment能夠創建動態的Activity佈局,這些佈局可以被修改是ui發生重大的變化,在某些情況下,這些改變可以視爲一個新的屏幕,在這樣的情況下,用戶可能會理所當然的期望按下back按鍵,程序會退回到上一個界面,那android也提供了這樣的技術,你只有在commit方法之前,調用FragmentTransaction的addToBackStack()方法,那你commit之後到了新的界面,然後按下back按鍵,程序就回到了你上一個界面。
比如。
// 開啓事務
mFragmentTransaction = mFragmentManager.beginTransaction();
// 替換Fragment
mFragmentTransaction.replace(R.id.main_ui_container_framelayout,mDynamicFragment);
// 添加回退棧
mFragmentTransaction.addToBackStack("");
// 提交事務
mFragmentTransaction.commit();
假如你是用現在的mDynamicFragment代替了之前的Fragment1,那有了addToBackStack方法,當你在mDynamicFragment界面的時候,你按下back按鈕,那程序就回到了Fragment1界面了。
呵呵,至此,Fragment就算是講完了,如果有什麼不明白的,加我qq,大家在一起相互討論吧。