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通信封装的更多相关文章
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...
- Android - Fragment (三)不同Fragment之间的通信
在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentM ...
- Fragment与Acitvity通信
Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为F ...
- 【Android开发】之Fragment与Acitvity通信
上一篇我们讲到与Fragment有关的常用函数,既然Fragment被称为是“小Activity”,现在我们来讲一下Fragment如何与Acitivity通信.如果上一篇还有不懂得,可以再看一下.传 ...
- Fragment和FragmentActivity的使用
可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1.使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容. 如果您的 ...
- Fragment间的通信
在网上看到的一篇文章,总结的很好 为了重用Fragment的UI组件,创建的每个Fragment都应该是自包含的.有它自己的布局和行为的模块化组件.一旦你定义了这些可重用的Fragment,你就可以把 ...
- Fragment之间的通信(四)
自定义两个fragment的布局和java类. 在mainactivity中引用布局文件 在其中的一个fragment中的控件上添加监听,获取到另一个fragment中控件的内容,展示出来完成frag ...
- Fragment与FragmentActivity的关系
前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...
随机推荐
- 在不连接网线的情况下Windos与VM之间如何ping通
一般情况下,如果宿主主机的网口连接网线并且能够上网,那么按照VM的默认安装,在VM-Settings-Hardware-Network Adapter-Network connection中选择Bri ...
- UITabbar的常用属性
// //设置tabbar的背景颜色 // [self.tabBar setBarTintColor:[UIColor redColor]]; // //设置选中时图片和文字的颜色 // [self. ...
- Win10玩魔兽争霸不能全屏显示的设置教程
Win10玩魔兽争霸不能全屏显示的设置教程: 1.右击桌面左下角的windows图标,显示图片内容,然后点击运行: 2.点击运行,有个输入框,输入regedit,点击确认: 3.显示win10注册表, ...
- hdu1284经典钱币兑换问题
钱币兑换问题. 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1284 完全背包. 这种是求背包问题最多的组合方案 参考了一些资料 http://blo ...
- Win7 x64安装Paramiko出问题
今天上午windows下配置paramiko环境时出现问题,随手记录下来. 先说一下我的环境: win7 x64 旗舰版.Python3.5.0.pip8.1.0 pip install para ...
- iOS XMPP之常见错误一:(<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>)
在XMPP开发中,使用XMPPStream进行连接服务器后,验证过程中,比较常见的一个错误是 <failure xmlns="urn:ietf:params:xml:ns:xmpp-s ...
- Chapter 3.单一职责原则
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,就等于把这些职责耦合在一起, ...
- zk mysql 主从自动切换
zookeeper测试: DBI 版本: /DBI-1.616# zjtest7-redis:/root/DBD-mysql-4.031# perl Makefile.PL Can't exec &q ...
- (step7.2.3)hdu 2554(N对数的排列问题——简单数论)
题目大意:输入一个整数n,表示有n对整数.判断能否出现一种情况就是2个1之间有1个数,2个2之间有2个数..... 解题思路: 准备知识: ①n对数,共2*n个数.所以要有2*n个位置来放置这2*n个 ...
- Android常用动画Animation的使用
Andriod中有几种常用的Animation AlphaAnimation 淡入淡出效果 RotateAnimation 旋转效果 ScaleAnimation 缩放动画 TranslaAnima ...