文档章节

Fragment实战使用之—— 一个activity管理多个fragment

veidy
 veidy
发布于 2015/03/23 17:17
字数 708
阅读 1629
收藏 69

Fragment相信大家并不陌生了,3.0后出来的碎片。但是听得多不代表用得也多,尤其用fragment替代activity的使用。

如果大家想对Fragment有一个详细的了解可以阅读这篇文章Android Fragment完全解析,关于碎片你所需知道的一切

 

我这里写了个Demo,体验一个activity管理多个fragment.(多说一句,一定要记得导入v4包,用v4里面的Fragment)

一个Activity,五个Fragment,其中BackHandledFragment是用来管理返回键处理的.其实还有一个BaseFragment,BackHandledFragmentent继承BaseFragment。然后FragmentA,FragmentB,FragmentC,FragmentD都继承BackHandledFragment。

 

我们先看看BaseFragment,里面封装了一个接口,一个方法,用来处理fragment之前的通信

 

然后我们看看MainActivity,要先实现一个接口,就是BaseFragment里面的OnFragmentInteractionListener

 

不要问我为什么连这个xml文件都贴上来,肯定对部分同志有帮助。 

,实现其方法,在里面处理fragment的路径切换(我这里通过字符串来处理切换不同的fragment,)

 

继续看addFragmentContent();这个方法,通过FragmentManger来管理fragment

 

,然后,我们再来看一个FragmentA里面

界面就一个button,点击后跳转到FragmentB。所以我们监听这个button的点击事件,然后处理FragmetnA到FragmentB。

 public void onButtonPressed(String uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

 

其实就是MaintActivity这里

 @Override
    public void onFragmentInteraction(String uri) {

        String intent = uri.toString();
        if (ATOB.equals(intent)) {
            addFragmentContent(FragmentB.newInstance("", ""));
        } else if (BTOC.equals(intent)) {
            addFragmentContent(FragmentC.newInstance("", ""));
        } else if (CTOD.equals(intent)) {
            addFragmentContent(FragmentD.newInstance("", ""));
        } else if (DTOA.equals(intent)) {
            addFragmentContent(FragmentA.newInstance("", ""));
        }
    }

。这样就实现了FragmentA切换到FragmentB。切换最关键的地方就是

 

private void addFragmentContent(Fragment paramFragment) {

        this.mFragmentManager = getSupportFragmentManager();

        FragmentTransaction localFragmentTransaction = this.mFragmentManager.beginTransaction();

        localFragmentTransaction.replace(R.id.fragment_container, paramFragment);
        //记录commit一次操作,与mFragmentManager.popBackStack();匹配使用
        localFragmentTransaction.addToBackStack(null);
        //commitAllowingStateLoss 优于 commit 方法,当使用commit方法时,系统将进行状态判断,如果状态(mStateSaved)已经保存,将发生"Can not perform this action after onSaveInstanceState"错误。
        //如果mNoTransactionsBecause已经存在,将发生"Can not perform this action inside of " + mNoTransactionsBecause错误。
        localFragmentTransaction.commitAllowingStateLoss();
    }



。大家体验一下就好了。

然后关于fragment返回键的处理。 我是参考这篇文章处理的,效果不错(优雅的让Fragment监听返回键)

然后在MainActivity里面实现这个接口BackHandledInterface

并实现其方法。

 

在onBackPressed()这个里面,真正的返回上一个fragment是mFragmentManager.popBackStack();

 

这里一定要注意,要想让其可以返回,一定得在commit前加上localFragmentTransaction.addToBackStack(null);

localFragmentTransaction.addToBackStack(null);与mFragmentManager.popBackStack(); 是匹配使用的.

 这里是统一处理每个fragment的回返键,如果某个fragment想单独处理,点击后不是返回上一个fragment,可以在fragment里的onBackPressed()实现

 

 

昨天忘记补上源码,今天补上,java文件跟xml文件。链接: http://pan.baidu.com/s/1qWx99oC 密码: mbab

© 著作权归作者所有

veidy

veidy

粉丝 131
博文 47
码字总数 18684
作品 0
深圳
技术主管
私信 提问
加载中

评论(3)

arj001
arj001

引用来自“rainbing”的评论

非常不错!!!

vbjjk
rainbing
rainbing
非常不错!!!
柳絮飘飞
柳絮飘飞
受教了, 非常不错
Android Studio教程07-Fragment的使用

目录 1. Fragment是什么 1.1. 设计原理和实例 2. 创建fragment 2.1. fragment的生命周期 2.2 添加用户界面:融入到Activity中 3. 管理fragment:FragmentManager 3.1. 执行片段事务 3.2. 与A...

Bricker666
01/21
0
0
Android技能树 — Fragment总体小结

前言: Android基础知识 Android技能树 — Fragment总体小结 Android技能树 — 动画小结 Android技能树 — View小结 Android技能树 — Activity小结 Android技能树 — View事件体系小结 Andr...

青蛙要fly
08/19
0
0
Android零基础入门第84节:引入Fragment原来是这么回事

随着大众生活水平的提高,再加上移动互联网的迅速发展,几乎每个人都至少拥有一台搭载Android系统的移动设备。Android设备的多样性给我们带来了很大的便捷,各Android设备拥有不同分辨率和不...

鑫鱻
2017/10/26
46
0
Android4.0-Fragment框架实现方式剖析(一)

经过反复的学习对比,个人觉得带着问题学习新知是最有效的学习方式,因此文本就以提问的方式来讲述Fragment框架实现方式。 1、什么是Fragment? Fragment包含在Activity中,Fragment只能存在...

程序袁_绪龙
2015/07/07
199
0
Android零基础入门第86节:探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期...

鑫鱻
2017/10/30
35
0

没有更多内容

加载失败,请刷新页面

加载更多

Es问题汇总

1.索引类型为Date问题 "activitytime": { "type": "date", "format": "epoch_second"} 报错:message [ElasticsearchException[Elasticsearch exception [type=mapper_parsing_......

HLee
7分钟前
2
0
项目启动 spring 莫名 爆null 空指针异常,排查

项目之前跑起来运行好好的,结果 其他相关的模块更新代码之后,项目启动报错了 2019-12-06 08:55:13 [main] ERROR o.s.boot.SpringApplication - Application startup failedjava.lang.Nu...

之渊
8分钟前
5
0
人工智能如何快速入门?这10个开源AI项目真太香!

在过去的几年中,机器学习在许多行业中开辟了新的视野,出现了一些高级用例:Facebook的面部识别,Netflix推荐的电影,PrismaAI的图像样式转换,Siri的语音识别,Google Allo的自然语言处理,...

Gaikikii
16分钟前
4
0
电脑数据加密用什么软件好?深圳源代码数据加密软件工具那个好?风奥科技

企业文件加密对于企业发展的重要性?现在科学技术的发展,信息化进程的加密快,信息化产品以及融入生活与我们的日常生活息息相关!例如个人用户在日常的网购、以及通过一定的设备来获取新闻等...

fasoft
36分钟前
4
0
redis运行一段时间之后假死

现象:redis运行一段时间之后就会出现假死的现象 假死指的是:进程在、pid在、telnet 端口是通的、redis-cli命令可以连接,但无法查询数据,查询的时候报错,如下图: 可以看到这个报错是有关...

Jack088
39分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部