在项目里面会经常用到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. JS获取中文拼音首字母,并通过拼音首字母高速查找页面内的中文内容

    实现效果: 图一: 图二: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/f ...

  2. Linux 多线程通信

    摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同一时候使用.只是要注意的是线程间须要做好同步,一般用mutex ...

  3. 使用zabbix监控nginx

    在zabbix agentd客户端上,查看nginx是否加载了--with-http_stub_status_module.因为zabbix监控nginx是根据 nginx的Stub Status模块 ...

  4. django-extensions

    命令行: admin后台管理扩展 后面会出现个放大镜实现搜索补齐功能. 交互式的 Python Shells(shell_plus) 实现自动导入 如果遇到apps中包含的的models名字出现冲突, ...

  5. 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:

    17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标: 你需要master ...

  6. win8安装驱动提示文件哈希值不在指定的目录文件中,此文件可能已损坏或被篡改解决办法

    解决办法: 1. 按快捷键win+R 打开运行命令 2. (请先看完后面的再操作!!)运行输入 shutdown.exe /r /o /f /t 00 3. 点击确定 4. 系统将重启 5. 重启后点 ...

  7. Http的操作(不传递参数)

    ttpResponse  httpResponse = null;       HttpEntity  httpEntity = null; HttpGet httpGet = new HttpGet ...

  8. libvirt学习

    高级libvirt API可划分为5个API部分:虚拟机监控程序连接API.域API.网络API.存储卷API.存储池API.

  9. QTP实践总结

    QTP实践总结 查询数据库修改freq 1.Testcasetable创建查询select * from testcasetable order by fseq desc 2.设计表-选项-修改自动递 ...

  10. 网页制作之html基础学习1-简介

    学习网页制作主要分为三大块 1.HTML    超文本标记语言( 全称:Hyper Text  Markup Language) 专门编辑静态网页 2.CSS      网页美化:是HTML控制的样式 ...