Fragment的使用注意事项

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实例不会被销毁,但是视图层次会被销毁,即会调用onDestoryViewonCreateView。若需保存当前fragment视图状态,则可以使用hide后add新的Fragment

Activity与Fragment通信

  • activity->fragment

    • 在创建fragment实例,通过setArguments(Bundle bundle)来实现,在Fragmetn中通过getArguments()来获取
    • 在fragment中通过getActivity()来获取宿主activity的对象,可以直接调用activity里的公有方法或属性
    • 广播
    • 接口
  • fragment->activity

    • 在activity中直接获取fragment的实例对象,可以获取公共属性或方法
    • 接口
    • 广播
  • fragment->framgment
    通过宿主activity来进行数据交互

Fragment重叠问题

当屏幕旋转或者内存重启(Fragment以及容器activity被系统回收后再打开时重新初始化)会导致Fragment重叠问题,是因为activity本身重启的时候会恢复Fragment,然后创建Fragment的代码又会新建一个Fragment的原因。

解决方法:在onCreate方法中判断参数Bundle savedInstanceState,为空时初始化Fragment实例,然后在Fragment中通过onSaveInstanceState的方法恢复数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容