Android Fragment

Fragment

  • Fragment的概念
    fragment是常用的组件之一。与activity相似,用于与用户交互的界面。比activity更加轻量级,更加灵活。依赖于activity,fragment的生命周期受activity的生命周期影响。

  • Fragment的生命周期
    onAttach():当Fragment与Activity关联时调用,可以通过该方法获取Activity的引用。
    onCreate():当Fragment被创建时调用,可以在该方法中进行一些初始化操作。
    onCreateView():当Fragment的UI被创建时调用,可以在该方法中返回Fragment的布局。
    onActivityCreated():当Fragment所在的Activity完成创建时调用,可以在该方法中进行一些与Activity相关的操作。
    onStart():当Fragment可见时调用,可以在该方法中开始一些动画或者启动一些线程。
    onResume():当Fragment获取焦点时调用,可以在该方法中开始一些用户交互操作。
    onPause():当Fragment失去焦点时调用,可以在该方法中停止一些用户交互操作。
    onStop():当Fragment不可见时调用,可以在该方法中停止一些动画或者线程。
    onDestroyView():当Fragment的UI被销毁时调用,可以在该方法中释放一些资源。
    onDestroy():当Fragment被销毁时调用,可以在该方法中释放一些资源。
    onDetach():当Fragment与Activity解除关联时调用,可以在该方法中释放Activity的引用。
    在这里插入图片描述

  • Fragment回退栈
    通过addToBackStack()方法将fragment添加进栈,如果你将Fragment任务添加到回退栈,当用户点击后退按键时,将看到上次保存的Fragment。一旦Fragment完全从回退栈中弹出,用户再次点击后退键,则退出当前Activity。
    1、当不添加回退栈时的生命周期:
    A跳转到B时A执行: onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
    再切换回A时: onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> onStart() -> onResume()
    按home键回到主页: onPause() -> onStop()
    主页返回A: onStart() -> onResume()
    2、当添加到回退栈时的生命周期:
    A跳转到B时A执行: onPause() -> onStop() -> onDestroyView()
    再切换回A时: onCreateView() -> onActivityCreated() -> onStart() -> onResume()
    按home键回到主页:
    主页返回A:

  • 动态添加Fragment步骤
    (1)创建Fragment实例
    (2)获取FragmentManager,可以通过getSupportFragmentMannager()方法得到
    (3)调用beginTransaction()方法开启一个事务
    (4)向容器内add()或replace()Fragment
    (5)调用commit()方法提交事务
    Fragment fragment = new Fragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.layout.fragment,fragment);
    ft.commit();

  • Fragment为什么有的时候会重叠,怎么产生的,又如何解决?
    1)发生了页面重启(旋转屏幕、内存不足等情况被强杀重启):
    系统在页面重启前,帮我们保存了Fragment的状态,但是在重启后恢复时,视图的可见状态没帮我们保存,而Fragment默认的是show状态,所以产生了Fragment重叠现象。
    2)重复replace|add Fragment 或者 使用show,hide控制Fragment:
    我们会在Activity的onCreate()里或者Fragment的onCreateView()里加载根Fragment,如在这里没有进行页面重启的判断的话,就可能导致重复加载Fragment引起重叠;在使用replace加载Fragment时,页面重启后,Fragment视图都还没创建,所以mHidden没有意义,不会发生重叠现象;而在使用add加载时,视图是存在的并且叠加在一起,页面重启后 mHidden=false,所有的Fragment都会是show状态显示出来(即VISIBLE),从而造成了Fragment重叠!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值