- 浏览: 593893 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
1 概述
多模块Activity+多Fragment 是开发APP非常适合的架构,相对于多Activity,这种架构APP占用内存降低,性能提升;相对于单Activity+多Fragment,这种开发起来逻辑相对简单,不容易出错。
对于多模块Activity+多Fragment,这里有两个概念需要我们了解一下:
同级式Fragment: 比如QQ的主界面,消息,联系人,动态,这三个Fragment就属于同级关系,我们平时项目中主界面的Fragment也是属于同级Fragment
流程式Fragment:比如我这个示例Demo,可以理解为用户账户流程,可以包括:登录/注册模块----忘记/找回密码模块----用户协议模块,这些Fragent就是属于流程式Fragment
我的示例Demo使用的是流程式Fragment,结合今天的主题----BaseActivity与BaseFragment的封装,我们一探究竟。
2 BaseActivity的封装
首先看一下代码:
1.两个必须实现的抽象方法,获取布局文件Layout的resource ID,获取布局文件中Fragment的ID
2.添加fragment:开启一个事物,替换了当前layout容器中的由getFragmentContentId()标识的fragment。通过调用 addToBackStack(String tag), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment,如果没有调用 addToBackStack(String tag), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它。其中参数tag将作为本次加入BackStack的Transaction的标志。commitAllowingStateLoss(),这种提交是允许发生异常时状态值丢失的情况下也能正常提交事物
3.移除fragment:与addToBackStack()相对应的接口方法是popBackStack(),调用该方法后会将事务操作插入到FragmentManager的操作队列,轮询到该事务时开始执行。这里进行了一下判断,获取回退栈中所有事务数量,大于1的时候,执行回退操作,等于1的时候,代表当前Activity只剩下一个Fragment,直接finish()当前Activity即可
4.监听返回键的返回事件,当事务数量等于1的时候,直接finish()
3 进一步封装AppActivity
1.一个必须实现的抽象方法来获取当前Activity应该显示的第一个Fragment
2.获取intent的方法,在需要传递/接受数据的Activity实现
3.在Activity的onCreate()方法中拿到intent,添加fragment
不过这样的封装是需要制定一个布局文件的,activity_base.xml布局文件代码为:
4 BaseFragment的封装
在APP运行在后台的时候,系统资源紧张的时候会导致后台的Activity被销毁,可能会带来一些问题,其中之一就是Fragment调用getActivity()的地方却返回null,报了空指针异常。
解决办法就是在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity代替getActivity()。
5 封装后的使用
BaseActivity与BaseFragment的封装都已经完成,接下来就是具体在项目中的使用了,这里分两种情况。
第一种情况:没有参数的传递
示例Demo中的主界面MainActivity,可以看到代码相当的精简,对应的MainFragment代码如下:
很简单的业务逻辑,点击第一个按钮跳转到LoginActivity,点击第二个按钮跳转到注册模块,布局文件代码就不贴了。
第二种情况:有参数的传递
可以看到,LoginActivity与之前不一样的是,重写了handleIntent()这个方法来获取传递过来的数据,重要的一点,创建Fragment的时候传递了一个参数。 代码很简单,即通过Arguments传递参数。
给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取。
这种使用arguments来创建Fragment的方法,强烈推荐使用:
1.这样就完成了Fragment和Activity间的解耦,使用Fragment的一个很大的原因,就是为了复用。这一点在我主界面点击第二个按钮跳转到注册界面有所体现
2.对Fragment传递数据,建议使用setArguments(Bundle args),而后在onCreate中使用getArguments()取出,在 内存不足导致异常时,系统会帮你保存数据,不会造成数据的丢失。和Activity的Intent原理一致。
3.使用newInstance(参数) 创建Fragment对象,优点是调用者只需要关心传递的哪些数据,而无需关心传递数据的Key是什么。
其他界面大同小异,大家可以在此自由发挥。关于流程式Fragment,就先到这里,看看同级式Fragment应该注意的问题。
6 hide()与show()导致的Fragment重叠
同级式Fragment在内存不足导致的异常情况下,会出现重叠现象,处理方法是在基类的Activity中onSaveInstanceState()内保存当前所在Fragment的tag或者下标,在onCreate()是恢复的时候,隐藏其它Fragment。
假设我们存在三个同级Fragment,目前Fragment为ContactFragment,此时切换到后台,由于内存因素导致Activity重建,我们就可以通过上述代码解决Fragment重叠以及回到ContactFragment页面。
当然要记得在onSaveInstanceState存储下当前页面信息
到这里,BaseActivity与BaseFragment的封装已经结束了,当然,这只是最最基础的封装,大家可以把一些常用的方法封装到基类当中。
转自:http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820216&idx=1&sn=64d0380fedf947c7adefc6d3eb722301&scene=0#wechat_redirect
多模块Activity+多Fragment 是开发APP非常适合的架构,相对于多Activity,这种架构APP占用内存降低,性能提升;相对于单Activity+多Fragment,这种开发起来逻辑相对简单,不容易出错。
对于多模块Activity+多Fragment,这里有两个概念需要我们了解一下:
同级式Fragment: 比如QQ的主界面,消息,联系人,动态,这三个Fragment就属于同级关系,我们平时项目中主界面的Fragment也是属于同级Fragment
流程式Fragment:比如我这个示例Demo,可以理解为用户账户流程,可以包括:登录/注册模块----忘记/找回密码模块----用户协议模块,这些Fragent就是属于流程式Fragment
我的示例Demo使用的是流程式Fragment,结合今天的主题----BaseActivity与BaseFragment的封装,我们一探究竟。
2 BaseActivity的封装
首先看一下代码:
1.两个必须实现的抽象方法,获取布局文件Layout的resource ID,获取布局文件中Fragment的ID
2.添加fragment:开启一个事物,替换了当前layout容器中的由getFragmentContentId()标识的fragment。通过调用 addToBackStack(String tag), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment,如果没有调用 addToBackStack(String tag), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它。其中参数tag将作为本次加入BackStack的Transaction的标志。commitAllowingStateLoss(),这种提交是允许发生异常时状态值丢失的情况下也能正常提交事物
3.移除fragment:与addToBackStack()相对应的接口方法是popBackStack(),调用该方法后会将事务操作插入到FragmentManager的操作队列,轮询到该事务时开始执行。这里进行了一下判断,获取回退栈中所有事务数量,大于1的时候,执行回退操作,等于1的时候,代表当前Activity只剩下一个Fragment,直接finish()当前Activity即可
4.监听返回键的返回事件,当事务数量等于1的时候,直接finish()
3 进一步封装AppActivity
1.一个必须实现的抽象方法来获取当前Activity应该显示的第一个Fragment
2.获取intent的方法,在需要传递/接受数据的Activity实现
3.在Activity的onCreate()方法中拿到intent,添加fragment
不过这样的封装是需要制定一个布局文件的,activity_base.xml布局文件代码为:
4 BaseFragment的封装
在APP运行在后台的时候,系统资源紧张的时候会导致后台的Activity被销毁,可能会带来一些问题,其中之一就是Fragment调用getActivity()的地方却返回null,报了空指针异常。
解决办法就是在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity代替getActivity()。
5 封装后的使用
BaseActivity与BaseFragment的封装都已经完成,接下来就是具体在项目中的使用了,这里分两种情况。
第一种情况:没有参数的传递
示例Demo中的主界面MainActivity,可以看到代码相当的精简,对应的MainFragment代码如下:
很简单的业务逻辑,点击第一个按钮跳转到LoginActivity,点击第二个按钮跳转到注册模块,布局文件代码就不贴了。
第二种情况:有参数的传递
可以看到,LoginActivity与之前不一样的是,重写了handleIntent()这个方法来获取传递过来的数据,重要的一点,创建Fragment的时候传递了一个参数。 代码很简单,即通过Arguments传递参数。
给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取。
这种使用arguments来创建Fragment的方法,强烈推荐使用:
1.这样就完成了Fragment和Activity间的解耦,使用Fragment的一个很大的原因,就是为了复用。这一点在我主界面点击第二个按钮跳转到注册界面有所体现
2.对Fragment传递数据,建议使用setArguments(Bundle args),而后在onCreate中使用getArguments()取出,在 内存不足导致异常时,系统会帮你保存数据,不会造成数据的丢失。和Activity的Intent原理一致。
3.使用newInstance(参数) 创建Fragment对象,优点是调用者只需要关心传递的哪些数据,而无需关心传递数据的Key是什么。
其他界面大同小异,大家可以在此自由发挥。关于流程式Fragment,就先到这里,看看同级式Fragment应该注意的问题。
6 hide()与show()导致的Fragment重叠
同级式Fragment在内存不足导致的异常情况下,会出现重叠现象,处理方法是在基类的Activity中onSaveInstanceState()内保存当前所在Fragment的tag或者下标,在onCreate()是恢复的时候,隐藏其它Fragment。
假设我们存在三个同级Fragment,目前Fragment为ContactFragment,此时切换到后台,由于内存因素导致Activity重建,我们就可以通过上述代码解决Fragment重叠以及回到ContactFragment页面。
当然要记得在onSaveInstanceState存储下当前页面信息
到这里,BaseActivity与BaseFragment的封装已经结束了,当然,这只是最最基础的封装,大家可以把一些常用的方法封装到基类当中。
转自:http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820216&idx=1&sn=64d0380fedf947c7adefc6d3eb722301&scene=0#wechat_redirect
发表评论
文章已被作者锁定,不允许评论。
-
android ScrollView常用属性
2016-05-09 09:17 710android:scrollbars 设置滚动条显示。none ... -
android RecyclerView使用及详解
2016-05-04 10:35 28971.前言 话说RecyclerView已经面市很久,也在很多 ... -
android DialogFragment 创建对话框(官方推荐)
2016-04-29 14:22 9081、 概述 DialogFragment在android 3. ... -
android Intent Flags及Task相关属性
2016-04-26 09:15 620task是一个具有栈结构的容器,可以放置多个Activity实 ... -
android SQLite具体实例应用详解(SQLiteOpenHelper)
2016-04-18 19:24 817上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们 ... -
android SQLite3常用命令&语法
2016-04-18 19:01 618sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常 ... -
android View绘制相关问题总结
2016-03-28 19:27 6831.View的绘制流程分几步 ... -
android Handler Looper MessageQueue机制的原理
2016-03-22 21:09 766andriod提供了Handler和Looper来满足线程间的 ... -
android Bitmap,BitmapFactory类图像处理
2016-03-16 16:28 2369BitMap代表一张位图,扩展名可以是.bmp或者.dib。 ... -
android 三类菜单(Option) (Context) (SubMenu)学习
2016-03-14 15:23 920在Android系统中,菜单可以分为三类:选项菜单(Optio ... -
android Sqlite数据库对象模型ORMLite框架学习
2016-03-11 15:24 710在Android项目中或多或少的都会使用数据库,为了提高我们的 ... -
android AsyncTask<参数,进度值类型,返回类型>学习
2016-03-10 14:45 1185AsyncTask和Handler对比 1 ... -
android 远程图片获取和本地缓存
2016-03-10 14:32 781概述 对于客户端——服 ... -
android onSaveInstanceState和onRestoreInstanceState学习
2016-03-10 10:08 798Android中的activity通过onSaveInst ... -
android Fragment生命周期和回退栈学习以及Fragment之间通信
2016-03-10 09:31 1533会涉及到Fragment如何产生,什么是Fragment,Fr ... -
android LruCache内存缓存学习(重写sizeOf方法)
2016-03-09 19:25 1064什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全 ... -
android ListView中的convertView缓存及使用
2016-03-09 19:12 1708一、复用convertView 首先讲下ListView的原 ... -
android 从资源角度谈Android代码内存优化
2016-03-09 18:54 718开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么 ... -
android startActivityForResult和setResult详情及Demo
2016-03-09 08:56 1052startActivityForResult与startAct ... -
android Toast详解以及自定义Toast例子
2016-01-28 14:15 1548Toast的用法 Toast只是一个View视图,快速的为用 ...
相关推荐
"Android-BaseFramework"就是这样一个专门针对BaseActivity和BaseFragment进行整合的库,旨在简化开发者的工作流程,提高开发效率。这个框架允许开发者直接从jCenter进行引用,意味着它已经被广泛测试并且与Android...
4. **Activity或Fragment的封装**:创建一个BaseActivity或BaseFragment,实现View接口,并持有Presenter的实例。在这个基类中,我们可以设置Presenter的生命周期管理,如在onCreate中初始化Presenter,在onDestroy...
一个Android的基础项目,里面会对项目基本架构模式进行一个示例,并对项目经常用到的如BaseActivity,BaseFragment,网络请求等进行一些基本封装,方便以后使用 基本架构模式 BaseProject会基于MVP架构作为基本架构...
PlanA是一个集成的BaseActivity,BaseFragment,BasePermission,PRouter路由管理,多种开发所需的工具类,Retrofit2 + Okhttp + RxJava的网络请求终极封装(行人实现网络请求),文件上传下载和进度缩减,多种开发...
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发...有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
省的自己导入BaseActivity,BaseFragment,集成好分辨率适配(屏幕适配),使开发者可以 用侵入性最小的代价完成Android屏幕适配(安卓分辨率适配),网络请求(RxJava2 Retrofit2), 有大量常用的工具类。...
项目中带有最基本的BaseActivity,BaseFragment封装 基本功能:1.滑动返回,所有的activity都extends SwipeBackAppCompatActivity,方便实现滑动返回。 2.BaseActivity BaseMvpActivity。如果你想再项目中使用MVP...
2.BaseActivity,BaseFragment,还有BaseView的封装,以便于对ViewPage中的View进行分别的管理,符合Java的封 装思想。 3.对BaseAdapter进行封装成MyBaseAdapter,引入BaseViewHolder,是个万能的ViewHolder; 4.很...
BaseActivity和BaseFragment是基类,它们封装了常见的操作,如初始化布局、处理生命周期事件、网络请求、数据绑定等。开发者可以通过继承这些基类,避免重复编写相同代码,提高代码复用性,同时降低错误率。 5. **...
以Pragmatic风格的Android应用参考示例,是android项目最佳实践的总结与演示 以“复杂的世界里,一个就够了”为理念,励志帮助Android开发人员快速搭建一个简单高效的android开发框架! ...
View 层的基类封装BaseActivity 、 BaseFragment 是抽象类,封装了布局文件 ID 、初始化 View 、初始化数据、开始请求、是否使用 EventBus 、状态栏等;BaseMvpActivity 、 BaseMvpFragment 分别继承 BaseActivity ...
易读 模仿网易云音乐UI,用知乎和gankio 网易新闻 豆瓣电影的API来完成一个基于Material Design Rxjava Retrofit dagger2 ...抽取BaseActivity和BaseFragment,非常值得学习,BaseActivity还添加了侧滑关闭哦,而且完全
这个项目中的基类包含`BaseActivity`和`BaseFragment`,它们是Android应用中Activity和Fragment的扩展,目的是为了规范化和简化应用程序的开发流程。下面将详细讲解这两个基类及其在Android开发中的作用。 首先,`...
2、框架封装了BaseActivity、BaseFragment等基类 3、框架封装了6.0动态授权在BaseActivity中,动态授权可以一行代码直接调用,如下: 4、下面大致截图讲解下如何使项目升级为mvp结构: 如上图,MainContract主要负责...
库中的BaseActivity可能是对Android原生Activity的扩展,封装了如权限请求、主题设置、导航栏定制等常见操作,让开发者可以更专注于业务逻辑的实现。 Fragment是用于支持多屏适配和复杂的UI结构的组件。...
4. **View抽象**:创建一个抽象的基类`BaseActivity`或`BaseFragment`,它们实现`IView`接口,提供通用的方法,如显示加载进度、错误处理等。 5. **Presenter管理**:使用`PresenterProvider`或`PresenterStore`类...
标题提到的"Base:一些基本代码的库,例如 BaseAdapter、BaseActivity、BaseFragment",这些都是Android开发中常见的基类,用于封装一些共通的功能,提升代码的复用性和可维护性。现在我们详细探讨一下这些基类。 1....
在实际项目中,为了提高代码的可复用性和可维护性,可以创建一个BaseActivity或BaseFragment,封装共同的逻辑,然后让具体的Activity和Fragment继承自它们。这样,只需要在子类中实现特定的业务逻辑,而通用的部分则...
此外,可能会有一个BaseActivity或BaseFragment,包含了初始化Presenter的通用逻辑,以减少代码重复。 为了测试,MVP模式也使得单元测试变得更加容易。由于Presenter独立于View和特定的Android组件,可以轻松地为...