Fragment与FragmentActivity通信封装

在项目里面会经常用到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通信封装,布布扣,bubuko.com

时间: 2024-08-24 15:18:06

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

使用EventBus进行Fragment和Activity通信

使用EventBus进行Fragment和Activity通信 本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信. github地址: https://github.com/greenrobot/EventBus 版本是 EventBus-2.4.0 release EventBus是基于订阅和发布的一种通信机制,使用流程如下: 实例化EventBus对象 注册订阅者 发布消息 接受消息 对应代码 EventBus eventBus = new EventB

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

在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentManager().findFragmentById(R.id.fragment_list); 但这样做耦合度太高,不方便后续的修改操作 Fragment与其附着的Activity之间的通信,都应该由Activity来完成 不能是多个Fragment之间直接通信 Fragment与其附着的Activi

Fragment与Acitvity通信

Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据: 2.在Fragment中,在onAttach()函数中通过调用getArguments()获得一个Bundle对象,从而获取我们提供的数据. 二.创建回调接口 比如说:新闻浏览情境下,共有两个Fragment,一个是用来显示新闻标题:另外一个用来显示新闻内容.当我们点击新闻

Fragment和FragmentActivity使用Demo

在这里用代码简单演示一下两个fragment加入到同一个activity中. fragment相当于一个封装了的组件了,fragment里有自己的生命周期,也相当于一个Activity,区别是fragment里面重写的方法必须有:oncreate(bundle):oncreateView();onpause(); 直接上代码: Fragment1.class public class Fragment1 extends Fragment{/* (non-Javadoc)* @see androi

【Android开发】之Fragment与Acitvity通信

上一篇我们讲到与Fragment有关的经常使用函数,既然Fragment被称为是"小Activity".如今我们来讲一下Fragment怎样与Acitivity通信.假设上一篇还有不懂得.能够再看一下. 传送门. Fragment与Activity通信的方式例如以下: 一.通过初始化函数提供 1.在动态加入Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据. 2.在Fragment中,在onAttach(

Fragment和FragmentActivity的使用

可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1.使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容. 如果您的应用使用在3.0以下.1.6及以上的版本,需要使用支持库来构建. 使用支持库的步骤: 使用SDK下的SDK Manager工具下载Android Support Package 2. 在您的Android工程的顶级目录下创建一个libs目录 3. 找到您的SDK下的/extras/android/s

搭建Activity与Fragment,Fragment与Fragment之间的通信架构

内心独白:  曾几何时但凡听到架构之两个字,总能联想到老子说的一句话:"玄之又玄,众妙之门".说不清,道不明.就像是看不见,摸不着,但又真实存在的东西给我们的那种感觉. 回顾人类的历史,繁重的劳动让我们意识到工具的必要性和重要性,并学会了去发明和使用工具.当我进行了大量的,甚至是繁重的编程之后,也开始重新意识到架构的必要性和重要性.当然软件工程发展了这么多年,构架与模式之类的东西前辈们早就说过并且践行与呼吁过,并且也留下了很多值得我们学习和研究的构架模式.但于我个人而言,在没有经历过痛

fragment和fragmentactivity解析

一.为什么要使用Fragment  1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类.Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期. 2. 多个Fragment可以放在一个Activity中(所以上面讲到类似一个嵌套Activity),而这个类可

[转][译][Android基础]Android Fragment之间的通信

2014-2-14 本篇文章翻译自Android官方的培训教程,我也是初学者,觉得官方的Training才是最好的学习材料,所以边学边翻译,有翻译不好的地方,请大家指正. 如果我们在开发过程中为了重用Fragment这个UI组件,那么我们应该把Fragment设计成是“自包含”.“模块化”组件,这种组件定义自己的布局和行为.一旦我们成功定义了这样的可重用的Fragment,我们就可以将他们与Activity进行关联,然后与整个Application进行整体的UI组装. 我们经常需要一个Fragm