Fragment 与FragmentActivity通信封装

在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActivity进一步封装,那在实际开发中只需要继承父类,然后调用一个方法就可以实现Fragment之间界面切换和值传递

1、FragmentActivity类的封装

[java]  view plain  copy
 print ?
  1. <span style="font-size:14px;">public class BaseChangeFragments extends BaseActivity {  
  2.   
  3.     protected FragmentManager mFragmentManager;  
  4.     protected FragmentTransaction mFragmentTransaction;  
  5.   
  6.     protected String mCurrentFragmentTag;  
  7.     protected Map<String, BaseFragment> mapFragments = new HashMap<String, BaseFragment>();  
  8.   
  9.     @Override  
  10.     protected void beforeCreate() {  
  11.         super.beforeCreate();  
  12.         mFragmentManager = getSupportFragmentManager();  
  13.     }  
  14.   
  15.     protected FragmentTransaction ensureTransaction() {  
  16.         if (mFragmentTransaction == null) {  
  17.             mFragmentTransaction = mFragmentManager.beginTransaction();  
  18.             // mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  
  19.             // mFragmentTransaction.addToBackStack(null);  
  20.             mFragmentTransaction  
  21.                     .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  
  22.         }  
  23.   
  24.         return mFragmentTransaction;  
  25.     }  
  26.   
  27.     protected BaseFragment getFragment(String tag) {  
  28.         BaseFragment f = (BaseFragment) (mFragmentManager  
  29.                 .findFragmentByTag(tag));  
  30.         if (f == null) {  
  31.             // 在这里判断tag,不同则实例化对应的fragment  
  32.             f = mapFragments.get(tag);  
  33.         }  
  34.         return f;  
  35.     }  
  36.   
  37.     protected void attachFragment(int layout, Fragment f, String tag) {  
  38.         if (f != null) {  
  39.             if (f.isDetached()) {  
  40.                 ensureTransaction();  
  41.                 mFragmentTransaction.attach(f);  
  42.             } else if (!f.isAdded()) {  
  43.                 ensureTransaction();  
  44.                 mFragmentTransaction.add(layout, f, tag);  
  45.             }  
  46.         }  
  47.     }  
  48.   
  49.     protected void detachFragment(Fragment f) {  
  50.         if (f != null && !f.isDetached()) {  
  51.             ensureTransaction();  
  52.             mFragmentTransaction.detach(f);  
  53.         }  
  54.     }  
  55.   
  56.     /** 
  57.      * @param layout 
  58.      * @param f 
  59.      * @param tag 
  60.      */  
  61.     protected void showFragment(int layout, BaseFragment f, String tag) {  
  62.         if (f != null) {  
  63.             if (!f.isAdded()) {  
  64.                 ensureTransaction();  
  65.                 f.updateNet();  
  66.                 mFragmentTransaction.add(layout, f, tag);  
  67.             } else {  
  68.                 ensureTransaction();  
  69.                 f.updateNet();  
  70.                 mFragmentTransaction.show(f);  
  71.             }  
  72.         }  
  73.     }  
  74.   
  75.     /** 
  76.      * 进行传值 
  77.      *  
  78.      * @param layout 
  79.      * @param f 
  80.      * @param tag 
  81.      * @param bundle 
  82.      */  
  83.     protected void showFragment(int layout, BaseFragment f, String tag,  
  84.             Bundle bundle) {  
  85.         if (f != null) {  
  86.             if (!f.isAdded()) {  
  87.                 ensureTransaction();  
  88.                 f.updateNet(bundle);  
  89.                 mFragmentTransaction.add(layout, f, tag);  
  90.             } else {  
  91.                 ensureTransaction();  
  92.                 f.updateNet(bundle);  
  93.                 mFragmentTransaction.show(f);  
  94.             }  
  95.         }  
  96.     }  
  97.   
  98.     protected void hideFragment(Fragment f) {  
  99.         if (f != null) {  
  100.             if (f.isAdded()) {  
  101.                 ensureTransaction();  
  102.                 mFragmentTransaction.hide(f);  
  103.             }  
  104.         }  
  105.     }  
  106.   
  107.     protected void commitTransactions() {  
  108.         if (mFragmentTransaction != null && !mFragmentTransaction.isEmpty()) {  
  109.             mFragmentTransaction.commit();  
  110.             mFragmentTransaction = null;  
  111.         }  
  112.     }  
  113.   
  114.     /** 
  115.      * 采用attach和detach来实现fragment的切换,每一次都会进入onCreateView 
  116.      *  
  117.      * @param tag 
  118.      */  
  119.     protected void switchFragmenCreate(String tag) {  
  120.         if (TextUtils.equals(mCurrentFragmentTag, tag))  
  121.             return;  
  122.         if (mCurrentFragmentTag != null)  
  123.             detachFragment(getFragment(mCurrentFragmentTag));  
  124.         attachFragment(R.id.container, getFragment(tag), tag);  
  125.         mCurrentFragmentTag = tag;  
  126.         commitTransactions();  
  127.     }  
  128.   
  129.     /** 
  130.      * 采用show和hide来实现fragment的切换,只有第一次都会进入onCreateView 
  131.      *  
  132.      * @param tag 
  133.      */  
  134.     protected void switchFragmen(String tag) {  
  135.         if (TextUtils.equals(mCurrentFragmentTag, tag))  
  136.             return;  
  137.         if (mCurrentFragmentTag != null)  
  138.             hideFragment(getFragment(mCurrentFragmentTag));  
  139.         showFragment(R.id.container, getFragment(tag), tag);  
  140.         mCurrentFragmentTag = tag;  
  141.         commitTransactions();  
  142.     }  
  143.       
  144.     /** 
  145.      * 切换界面,通过bundle来传值 
  146.      * @param tag 
  147.      * @param bundle 
  148.      */  
  149.     protected void switchFragmen(String tag, Bundle bundle) {  
  150.         if (TextUtils.equals(mCurrentFragmentTag, tag))  
  151.             return;  
  152.         if (mCurrentFragmentTag != null)  
  153.             hideFragment(getFragment(mCurrentFragmentTag));  
  154.         showFragment(R.id.container, getFragment(tag), tag, bundle);  
  155.         mCurrentFragmentTag = tag;  
  156.         commitTransactions();  
  157.     }  
  158.   
  159. }</span>  
上面包含了三种切换方式分别是:(1)attach和detach (2)show和hide -- 不传值(3)show和hide--传值

其中传值方式采用接口回调的方式实现,比如下面这个方法:

[java]  view plain  copy
 print ?
  1. <span style="font-size:14px;">/** 
  2.      * 进行传值 
  3.      *  
  4.      * @param layout 
  5.      * @param f 
  6.      * @param tag 
  7.      * @param bundle 
  8.      */  
  9.     protected void showFragment(int layout, BaseFragment f, String tag,  
  10.             Bundle bundle) {  
  11.         if (f != null) {  
  12.             if (!f.isAdded()) {  
  13.                 ensureTransaction();  
  14.                 f.updateNet(bundle);  --采用接口回调告知fragment显示以及更新数据两个功能  
  15.                 mFragmentTransaction.add(layout, f, tag);  
  16.             } else {  
  17.                 ensureTransaction();  
  18.                 f.updateNet(bundle);  
  19.                 mFragmentTransaction.show(f);  
  20.             }  
  21.         }  
  22.     }</span>  

其中里面BaseActivity这个类是在我的项目的基础类,我把onCreate里面的添加的空方法写出来

[java]  view plain  copy
 print ?
  1. <span style="font-size:14px;">@Override  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         startIntent = new Intent();  
  5.         beforeCreate();  
  6.         LogUtils.customTagPrefix = "IDPoc";  
  7.         initView();  
  8.         initListener();  
  9.         initData();  
  10.     }  
  11. </span>  

回调接口如下:

[java]  view plain  copy
 print ?
  1. <span style="font-size:14px;">public interface IFragmentChange {  
  2.     void setId(String id, Bundle bundle);  
  3. }</span>  

在Fragment类中实现:

[java]  view plain  copy
 print ?
  1. <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  
  2.     public void onAttach(Activity activity) {  
  3.         super.onAttach(activity);  
  4.         mFragmentChange = (IFragmentChange) activity;  
  5.     }  
  6.   
  7.     @Override  
  8.     public void onDetach() {  
  9.         super.onDetach();  
  10.         mFragmentChange = null;  
  11.     }  
  12. </span>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值