Android开发Android技术知识Android开发

Android开发总结之Fragment

2019-03-07  本文已影响18人  WangGavin

1 Fragment是什么?

Fragment碎片,我的理解就是一个具有生命周期的容器控件,只不过Fragment是寄生在Activity上的,是由Activity来管理,而不是像Activity一样由系统来管理的。所以用法上Fragment比Activity更轻巧灵活。

因其比Activity更节省内存,便于切换,使用频率不低于四大组件,所以俗称"第五大组件"

目前大多数使用v4包下的Fragment.

1.1 谈谈Fragment与Activity的区别

共同点:都有生命周期方法,而且很类似。
不同点

2 怎样添加Fragment?

2.1 静态添加

在Activity或Fragment的xml布局文件里添加fragment标签

特点:添加方式简单但灵活性不够,默认就将Fragment和Activity的视图绑定在一起。

2.2 动态添加

java代码new 一个Fragment,再通过在Activity/Fragment的FragmentManager/ChildFragmentManager,管理该Fragment(加载移除替换).

具体步骤:

方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式。

2.2.1 FragmentTransaction操作

getSupportFragmentManager().getFragments():获取当前Activity ViewTree上有Fragment的Fragment列表。

attach(), detach()
add(), remove(),
show(), hide(),
replace()

3 Fragment的生命周期

我总结的基本原则Activty已死(不可见),那么在它上的Fragment也必须死。Activity活着(可见),Fragment可以随便死,随便生,有点像地球和地球上生物的生死关系^-^

3.1 在Fragment始终依附在Activity上的情况下:

[图片上传失败...(image-d502bc-1551951782199)]

我理解为Fragment的对应周期都要比Activity晚一点,毕竟“先有母鸡,才有小鸡”嘛,Activity created对应Fragment的onAttach(),onCreate(),onCreateView(),onActivityCreated(),好了这段时间都是创建创建,然后界面进入可见不可交互状态,即onStart(),然后界面进入可见可交互状态,也就是onResume();当然反过来,Activty stop了,destroy了,Fragment也要跟着销毁。

3.2 在Activity可见,FragmentManager动态管理Fragment的的情况下:

略,2.2.1已讲。

4 FragmentPageAdapter和FragmentPageStateAdapter的区别

5 Fragment通信

Fragment同Activity,Fragment之间通信一般都是为了满足界面数据同步的业务需求。

5.1 Fragment与Activity通信

5.1.1 Fragment 传消息给Activity

5.1.1.1 Fragment 传消息给与它atttach()的ctivity

1 (常用)Fragment通过getActivity()获取Activity实例,然后强转为对应的Activity类或接口,最后调用。前提是getActivity()不为null,即Fragment还没有detach()。

image

2 Fragment通过发广播,然后Activity接收实现。

3 Fragment通过事件总线(EventBus,RxBus)发消息,然后Activity接收实现。

5.1.1.2 Fragment 传消息给与其他Activity

1 跳转到另一个Activity传:startActivityForResult([携带数据的intent])

2 Fragment通过发广播,然后Activity接收实现。

3 Fragment通过事件总线(EventBus,RxBus)发消息,然后Activity接收实现。

5.1.2 Activity传消息给Fragment

一般是传消息给和自己attanch的fragment.

1 构造Fragment时传,一般Fragment都要自己定义个工厂方法。
2 通过FragmentManager和Fragment ID获取Fragment实例,再调用Fragment实现。
3 不推荐用广播和EventBus

5.2 Fragment与Fragment通信

1 Fragment通过getActivity调Activity,然后Activity通过FragmentManager找到目标Fragment,然后调用目标Fragment

2 广播或者事件总线:原理是观察者与被观察者模式,即多个Fragment统一观察某一个对象

5.3 不同的Fragment,Activity观察同一个ViewModel来实现同步,也是一种通信策略

6 BackStack回退栈

Activity有任务栈,Fragment也有类似的栈,称为回退栈,由FragmentManager管理。默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment事务加入回退栈,则可以加入addToBackStack(tag)。如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回键会回滚Fragment事务。

BackStack回退栈一般用于我理解的“纵向”导航,就是从一个界面一层一层深入到里面的界面。
不适合“横向”导航,也就是在一个界面里横向切换不同视图。

7 Fragment重叠现象

一般是在用add()、show()、hide()这三个方法管理Fragment切换的导航业务场景。

出现原因:Activity被重建,当然重建原因一是系统配置发生改变,二是内存不足被回收。

重现方法:

具体原因:

解决方案一:

具体方案可参考:fragment重叠的完美解决方案

解决方案二:

让Activity异常销毁时,不保存数据

//解决重叠,方法1@Override
protectedvoidonSaveInstanceState(Bundle outState) {
//如果用以下这种做法则不保存状态,再次进来的话会显示默认tab
//super.onSaveInstanceState(outState);
}

不过这种方案不推荐,假如Activity就是要保存比如非fragment view的数据,好恢复销毁前的状态呢?

8 扩展杂谈

为什么 JakeWharton 建议:App 只要用到一个 Activity ?

咦,一个App只用一个Activity,Flutter就是这样的啊,要是这样还不如用flutter。
另外我觉得一个App只用一个Activity,其它用Fragment这样的方案也只能在业务量小的应用用,毕竟Activity和Fragment之间的关系还是蛮复杂的。

上一篇 下一篇

猜你喜欢

热点阅读