吐槽
苦逼的我之前自己用了一個堆棧來管理多個Fragment的跳轉,寫得我想吐。現在才發現一切原來那么簡單,哎,面壁去。。。。
摘要
對Fragment的add、remove以及replace操作中,都是通過FragmentTransaction的事務來操作的。你可以在beginTransaction之后
執行一系列Fragment的操作,而在提交之前,如果你使用了 addToBackStack 函數,則可以將本次事務操作保存在堆棧中。從而使當你按了
后退按鈕時它可以還原事務的操作使得界面返回到本次事務之前的狀態。 效果相當於返回前一個Activity。
本文實現了選項卡框架的多層跳轉及返回實現。
正文
在你的FragmentActivity(我所使用的類名為 MainTabHost )中加入以下函數,此函數可以實現指定選項卡對應界面的跳轉。
/** * 替換指定標簽頁中的Fragment * @param containerViewID 進行替換的標簽頁ID * @param frag * @param tag 標簽 * @param addToBackStack 是否添加到堆棧中 */ public void replaceTabView(int containerViewID, Fragment frag, String tag, boolean addToBackStack){ FragmentManager fm = this.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(containerViewID, frag, tag); if(addToBackStack){ ft.addToBackStack(null); } ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); }
而在實際使用中,我們經常是要切換當前選項卡中的視圖,比如你在新聞標簽頁中的列表點擊一條新聞進入詳細頁面。所以添加以下替換當前界面的函數供使用會方便很多
(其中mTabHost是你的TabHost 實例):
/** * 替換當前選項卡頁界面 */ public void replaceCurrentTab(Fragment frag, String tag){ replaceTabView(mTabHost.getCurrentView().getId(), frag, tag, true); }
我模擬的時候是通過在一個Fragment中加入一個跳轉按鈕,當點擊的時候跳轉到第二個Fragment中去。 我這里通過FirstPageFragment
跳轉到 SecondFloorFragment 中去。
public void changeToSecondFloorFragment(){ MainTabHost host = (MainTabHost)this.getActivity(); //轉換成自己的Activity host.replaceCurrentTab(new SecondFloorFragment(), "second"); }
好了,通過添加以上代碼,在FirstPageFragment可以跳轉到SecondFloorFragment中去,而當你按返回鍵的時候,可以返回到FirstPageFragment之中。