Fragment相信你們並不陌生了,3.0後出來的碎片。可是聽得多不表明用得也多,尤爲用fragment替代activity的使用。 java
若是你們想對Fragment有一個詳細的瞭解能夠閱讀這篇文章Android Fragment徹底解析,關於碎片你所需知道的一切。 ide
我這裏寫了個Demo,體驗一個activity管理多個fragment.(多說一句,必定要記得導入v4包,用v4裏面的Fragment) this
一個Activity,五個Fragment,其中BackHandledFragment是用來管理返回鍵處理的.其實還有一個BaseFragment,BackHandledFragmentent繼承BaseFragment。而後FragmentA,FragmentB,FragmentC,FragmentD都繼承BackHandledFragment。 spa
咱們先看看BaseFragment,裏面封裝了一個接口,一個方法,用來處理fragment以前的通訊 .net
而後咱們看看MainActivity,要先實現一個接口,就是BaseFragment裏面的OnFragmentInteractionListener code
不要問我爲何連這個xml文件都貼上來,確定對部分同志有幫助。 orm
,實現其方法,在裏面處理fragment的路徑切換(我這裏經過字符串來處理切換不一樣的fragment,) xml
繼續看addFragmentContent();這個方法,經過FragmentManger來管理fragment blog
,而後,咱們再來看一個FragmentA裏面 繼承
界面就一個button,點擊後跳轉到FragmentB。因此咱們監聽這個button的點擊事件,而後處理FragmetnA到FragmentB。
public void onButtonPressed(String uri) {
其實就是MaintActivity這裏
@Override
public void onFragmentInteraction(String uri) {
String intent = uri.toString();
if (ATOB.equals(intent)) {
addFragmentContent(FragmentB.newInstance("", ""));
} else if (BTOC.equals(intent)) {
addFragmentContent(FragmentC.newInstance("", ""));
} else if (CTOD.equals(intent)) {
addFragmentContent(FragmentD.newInstance("", ""));
} else if (DTOA.equals(intent)) {
addFragmentContent(FragmentA.newInstance("", ""));
}
}
。這樣就實現了FragmentA切換到FragmentB。切換最關鍵的地方就是
private void addFragmentContent(Fragment paramFragment) { this.mFragmentManager = getSupportFragmentManager(); FragmentTransaction localFragmentTransaction = this.mFragmentManager.beginTransaction(); localFragmentTransaction.replace(R.id.fragment_container, paramFragment); //記錄commit一次操做,與mFragmentManager.popBackStack();匹配使用 localFragmentTransaction.addToBackStack(null); //commitAllowingStateLoss 優於 commit 方法,當使用commit方法時,系統將進行狀態判斷,若是狀態(mStateSaved)已經保存,將發生"Can not perform this action after onSaveInstanceState"錯誤。 //若是mNoTransactionsBecause已經存在,將發生"Can not perform this action inside of " + mNoTransactionsBecause錯誤。 localFragmentTransaction.commitAllowingStateLoss(); }
。你們體驗一下就行了。
而後關於fragment返回鍵的處理。 我是參考這篇文章處理的,效果不錯(優雅的讓Fragment監聽返回鍵)
而後在MainActivity裏面實現這個接口BackHandledInterface
並實現其方法。
在onBackPressed()這個裏面,真正的返回上一個fragment是mFragmentManager.popBackStack();
這裏必定要注意,要想讓其能夠返回,必定得在commit前加上localFragmentTransaction.addToBackStack(null);
localFragmentTransaction.addToBackStack(null);與mFragmentManager.popBackStack(); 是匹配使用的.
這裏是統一處理每一個fragment的回返鍵,若是某個fragment想單獨處理,點擊後不是返回上一個fragment,能夠在fragment裏的onBackPressed()實現
昨天忘記補上源碼,今天補上,java文件跟xml文件。連接: http://pan.baidu.com/s/1qWx99oC 密碼: mbab