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

Fragment与FragmentActivity通信封装的更多相关文章

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

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...

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

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

  3. Android - Fragment (三)不同Fragment之间的通信

    在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentM ...

  4. Fragment与Acitvity通信

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

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

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

  6. Fragment和FragmentActivity的使用

    可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1.使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容. 如果您的 ...

  7. Fragment间的通信

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

  8. Fragment之间的通信(四)

    自定义两个fragment的布局和java类. 在mainactivity中引用布局文件 在其中的一个fragment中的控件上添加监听,获取到另一个fragment中控件的内容,展示出来完成frag ...

  9. Fragment与FragmentActivity的关系

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

随机推荐

  1. frame和bounds的区别

    frame:根据父视图坐标系来确定自己的位置 bounds:该视图在自己坐标系的位置和大小 修改bounds并不会引起视图位置的变化,会影响自身子视图的位置:修改frame会引起视图位置的变化 UIV ...

  2. 【JUnit4.10源码分析】5 Statement

    假设要评选JUnit中最最重要的类型.或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.ru ...

  3. android代码实现关机

      1.API没有开放,需要提升为syetem app级别! 2.android 模块编译,mm 命令 2.1.先进入顶层  source build/envsetup.sh 2.2.进入目录   m ...

  4. 【Eclipse Plugin】SonarQube 启动报错

    由于近期,信息安全部在搞代码优化工作.所以,配合上边的工作需求,使用sonar对代码进行优化检测.在Eclipse上装Sonar很简单,只要在Eclipse Marketplace上面搜索“Sonar ...

  5. 什么是CALayer

    一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. * 其实UIView之所以 ...

  6. MVC 扩展 Html.ImageFor

    Asp.Net MVC 扩展 Html.ImageFor 方法详解 背景: 在Asp.net MVC中定义模型的时候,DataType有DataType.ImageUrl这个类型,但htmlhelpe ...

  7. hibernate对应的annocation版本

    Hibernate Compatibility Matrix Package Version Core Annotations EntityManager Validator Search Shard ...

  8. Python 数据处理扩展包: pandas 模块的DataFrame介绍(读写数据库的操作)

    1.读取表中的内容,如下例子: import MySQLdb try: conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='root ...

  9. 利用cmake来搭建开发环境

    对于经常在终端下写程序的non-windows程序员,Makefile绝对是最常用的工具,小到一个文件的简单的测试程序,大到数百个文件的商业软件,只需要有shell,一个make命令就可得到可运行的程 ...

  10. ORM框架Hibernate (四) 一对一单向、双向关联映射

    简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...