在项目里面会经常用到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>(); @Override protected 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,不同则实例化对应的fragment f = 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;">@Override protected 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;">@Override public void onAttach(Activity activity) { super.onAttach(activity); mFragmentChange = (IFragmentChange) activity; } @Override public void onDetach() { super.onDetach(); mFragmentChange = null; } </span>
这样的话,切换fragment界面的时候,只需要调用那三个中的一个就可以了。