在项目里面会经常用到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界面的时候,只需要调用那三个中的一个就可以了。

Fragment与FragmentActivity通信封装相关推荐

  1. 【Android开发】之Fragment与Acitvity通信

    上一篇我们讲到与Fragment有关的常用函数,既然Fragment被称为是"小Activity",现在我们来讲一下Fragment如何与Acitivity通信.如果上一篇还有不懂 ...

  2. Fragment与Acitvity通信

    Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为F ...

  3. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信...

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  4. Fragment 和 FragmentActivity的使用

    Fragment 和 FragmentActivity的使用 http://blog.csdn.net/izy0001989624/article/details/17072211 转载于:https ...

  5. Fragment之间的通信

    在本节中,你会学到 1.定义接口 2.实现接口 3.将消息传递给fragment 为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让frag ...

  6. Fragment与FragmentActivity的关系

    前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...

  7. Fragment间的通信

    在网上看到的一篇文章,总结的很好 为了重用Fragment的UI组件,创建的每个Fragment都应该是自包含的.有它自己的布局和行为的模块化组件.一旦你定义了这些可重用的Fragment,你就可以把 ...

  8. 转 Fragment 和 FragmentActivity的使用

    今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习. 要想用Fragment ...

  9. Fragment的生命周期同一Activity下不同Fragment之间的通信

    Android开发:碎片Fragment完全解析(2) Fragment的生命周期 和Activity一样,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我们通过代码的方 ...

最新文章

  1. Python rstrip()方法 删除 string 字符串末尾的指定字符(默认为空格).
  2. 2019.03.21 增删改
  3. 国内唯一,阿里云挺进 Forrester 数据流分析报告“强劲表现者”象限
  4. formdata怎么传数组_如何使用formData上传file数组
  5. VigiBase中搜索和眼病相关的统计数据
  6. linux下面使用飞书个人版预览doc
  7. 升级MariaDB为10.1版本
  8. 【ES6(2015)】Array数组
  9. 如何做好Web 安全测试
  10. Python文件输入输出
  11. vue、四级联动(省市区街道)
  12. 基于NanoPi3(三星S5P6818)的kernel移植(二)
  13. java 16 规定_java并发编程(十六)happen-before规则
  14. DataX--异构数据源数据交换工具
  15. 2月28日云栖精选夜读:用人工智能提升营销效率,阿里妈妈启动2018国际广告算法大赛
  16. python3两个三阶矩阵相乘_两个三阶矩阵相乘的例子和方法!急!
  17. python模糊神经网络预测_一种基于模糊神经网络的化学分子生物毒性预测模型算法的制作方法...
  18. 重新夺回你自己,做个强烈自我意识的人
  19. 危机边缘第五季/全集Fringe迅雷下载
  20. Marketing and Monetizing on YouTube YouTube上的营销和货币化 Lynda课程中文字幕

热门文章

  1. SpringMvc 400 Bad Request解决方法
  2. 站点页面Service Unavailable 503的一种解决方法
  3. postgresql查看死锁及解决方法
  4. ThreadLocal 遇上线程池的问题及解决办法
  5. PowerShell说“此系统上的脚本执行被禁用。”
  6. 详解电脑屏幕垃圾广告怎么去除
  7. redis的安装和命令的使用(史上最全命令集合)
  8. mybatis传统方式开发DAO
  9. mybatis当输入参数有多个时的解决方案,Map类型,索引引用输入参数,map输出
  10. jackson用法,json转换