Fragment與FragmentActivity通訊封裝

來源:互聯網
上載者:User

標籤:fragment與fragmentact

在項目裡面會經常用到Fragment與FragmentActivity,比如Fragment之間的介面切換與Fragment之間的值傳遞等等,為了方便起見我把Fragment和FragmentActivity進一步封裝,那在實際開發中只需要繼承父類,然後調用一個方法就可以實現Fragment之間介面切換和值傳遞

1、FragmentActivity類的封裝

<span style="font-size:14px;">public class BaseChangeFragments extends BaseActivity {protected FragmentManager mFragmentManager;protected FragmentTransaction mFragmentTransaction;protected String mCurrentFragmentTag;protected Map<String, BaseFragment> mapFragments = new HashMap<String, BaseFragment>();@Overrideprotected void beforeCreate() {super.beforeCreate();mFragmentManager = getSupportFragmentManager();}protected FragmentTransaction ensureTransaction() {if (mFragmentTransaction == null) {mFragmentTransaction = mFragmentManager.beginTransaction();// mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);// mFragmentTransaction.addToBackStack(null);mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);}return mFragmentTransaction;}protected BaseFragment getFragment(String tag) {BaseFragment f = (BaseFragment) (mFragmentManager.findFragmentByTag(tag));if (f == null) {// 在這裡判斷tag,不同則執行個體化對應的fragmentf = mapFragments.get(tag);}return f;}protected void attachFragment(int layout, Fragment f, String tag) {if (f != null) {if (f.isDetached()) {ensureTransaction();mFragmentTransaction.attach(f);} else if (!f.isAdded()) {ensureTransaction();mFragmentTransaction.add(layout, f, tag);}}}protected void detachFragment(Fragment f) {if (f != null && !f.isDetached()) {ensureTransaction();mFragmentTransaction.detach(f);}}/** * @param layout * @param f * @param tag */protected void showFragment(int layout, BaseFragment f, String tag) {if (f != null) {if (!f.isAdded()) {ensureTransaction();f.updateNet();mFragmentTransaction.add(layout, f, tag);} else {ensureTransaction();f.updateNet();mFragmentTransaction.show(f);}}}/** * 進行傳值 *  * @param layout * @param f * @param tag * @param bundle */protected void showFragment(int layout, BaseFragment f, String tag,Bundle bundle) {if (f != null) {if (!f.isAdded()) {ensureTransaction();f.updateNet(bundle);mFragmentTransaction.add(layout, f, tag);} else {ensureTransaction();f.updateNet(bundle);mFragmentTransaction.show(f);}}}protected void hideFragment(Fragment f) {if (f != null) {if (f.isAdded()) {ensureTransaction();mFragmentTransaction.hide(f);}}}protected void commitTransactions() {if (mFragmentTransaction != null && !mFragmentTransaction.isEmpty()) {mFragmentTransaction.commit();mFragmentTransaction = null;}}/** * 採用attach和detach來實現fragment的切換,每一次都會進入onCreateView *  * @param tag */protected void switchFragmenCreate(String tag) {if (TextUtils.equals(mCurrentFragmentTag, tag))return;if (mCurrentFragmentTag != null)detachFragment(getFragment(mCurrentFragmentTag));attachFragment(R.id.container, getFragment(tag), tag);mCurrentFragmentTag = tag;commitTransactions();}/** * 採用show和hide來實現fragment的切換,只有第一次都會進入onCreateView *  * @param tag */protected void switchFragmen(String tag) {if (TextUtils.equals(mCurrentFragmentTag, tag))return;if (mCurrentFragmentTag != null)hideFragment(getFragment(mCurrentFragmentTag));showFragment(R.id.container, getFragment(tag), tag);mCurrentFragmentTag = tag;commitTransactions();}/** * 切換介面,通過bundle來傳值 * @param tag * @param bundle */protected void switchFragmen(String tag, Bundle bundle) {if (TextUtils.equals(mCurrentFragmentTag, tag))return;if (mCurrentFragmentTag != null)hideFragment(getFragment(mCurrentFragmentTag));showFragment(R.id.container, getFragment(tag), tag, bundle);mCurrentFragmentTag = tag;commitTransactions();}}</span>
上麵包含了三種切換方式分別是:(1)attach和detach (2)show和hide -- 不傳值(3)show和hide--傳值

其中傳值方式採用介面回調的方式實現,比如下面這個方法:

<span style="font-size:14px;">/** * 進行傳值 *  * @param layout * @param f * @param tag * @param bundle */protected void showFragment(int layout, BaseFragment f, String tag,Bundle bundle) {if (f != null) {if (!f.isAdded()) {ensureTransaction();f.updateNet(bundle);  --採用介面回調告知fragment顯示以及更新資料兩個功能mFragmentTransaction.add(layout, f, tag);} else {ensureTransaction();f.updateNet(bundle);mFragmentTransaction.show(f);}}}</span>

其中裡面BaseActivity這個類是在我的項目的基礎類,我把onCreate裡面的添加的空方法寫出來

<span style="font-size:14px;">@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);startIntent = new Intent();beforeCreate();LogUtils.customTagPrefix = "IDPoc";initView();initListener();initData();}</span>

回調介面如下:

<span style="font-size:14px;">public interface IFragmentChange {void setId(String id, Bundle bundle);}</span>

在Fragment類中實現:

<span style="font-size:14px;"></span><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:14px;"><span style="color: #bb2ca2">private</span> IFragmentChange mFragmentChange;</span></p><span style="font-size:14px;">@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mFragmentChange = (IFragmentChange) activity;}@Overridepublic void onDetach() {super.onDetach();mFragmentChange = null;}</span>

這樣的話,切換fragment介面的時候,只需要調用那三個中的一個就可以了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.