Fragment任务栈
Fragment也添加任务栈管理,从而实现多个Fragment先后添加后可以返回上一个Fragment,当activity容器内没有Fragment时回退则退出Activity。
Activity是由任务栈管理的,遵循先进后出的原则,fragment任务栈的效果和activity一样
- 实现方式
//必须在commit之前调用
FragmentTransaction.addToBackStack(null) ;
完整代码如下:
Fragment fg = new Fragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragment_container, fg, "tag_fragment");
ft.addToBackStack(null);
ft.commit();
- 注:
1.activity的第一个Fragment(根Fragment)可以不添加回退栈,这样最后一个Fragment按返回时就不会空白
而是直接退出activity。(若Activity中全部是fragment组成,且fragment都添加了回退栈
,这样返回到第一个fragment后页面会出现空白
)
2.调用addToBackStack(null)将当前的事务添加到了回退栈,调用replace方法后Fragment实例不会被销毁
,但是视图层次会被销毁
,即会调用onDestoryView
和onCreateView
。若需保存当前fragment视图状态,则可以使用hide后add新的Fragment
Activity与Fragment通信
-
activity->fragment
- 在创建fragment实例,通过
setArguments(Bundle bundle)
来实现,在Fragmetn中通过getArguments()
来获取 - 在fragment中通过getActivity()来获取宿主activity的对象,可以直接调用activity里的公有方法或属性
- 广播
- 接口
- 在创建fragment实例,通过
-
fragment->activity
- 在activity中直接获取fragment的实例对象,可以获取公共属性或方法
- 接口
- 广播
fragment->framgment
通过宿主activity来进行数据交互
Fragment重叠问题
当屏幕旋转或者内存重启(Fragment以及容器activity被系统回收后再打开时重新初始化)会导致Fragment重叠问题,是因为activity本身重启的时候会恢复Fragment,然后创建Fragment的代码又会新建一个Fragment的原因。
解决方法
:在onCreate方法中判断参数Bundle savedInstanceState,为空时初始化Fragment实例,然后在Fragment中通过onSaveInstanceState
的方法恢复数据