Android中的Fragment

Fragment跟其他布局类型一样,都是Layout的扩展类,可以帮助UI变得更灵活。

Fragment的创建

Android Studio提供了Fragment的创建向导。以创建Fragment(Blank)为例。

这里写图片描述

创建过程很简单,包括三个Optional选项

(1)Create layout XML
(2)Include fragment factory methods
(3)Include interface callbacks

若默认都选,则IDE将创建一个Fragment类,及其对应的布局文件。而Fragment类中将包含以下内容:

(a)定义一个名为OnFragmentInteractionListener的Interface
(b)重写的onDetach()方法
(c)重写的onAttach()方法
(d)重写的onCreateView()方法
(e)重写的onCreate()方法
(f)静态的newInstance()工厂类方法
(g)默认的无参构建方法BlankFragment()
(h)自定义的onButtonPressed()方法(无意义)

若不选择Optional(1),则不创建布局文件
若不选择Optional(2),则不会包含内容(e),(f)
若不选择Optional(3),则不会包含内容(a),(b),(c),(h)

自动创建的BlankFragment布局文件,默认以FrameLayout作为根布局。可以改为其他布局类型,将FrameLayout放入父级Activity中,以方便与其他Fragment进行灵活地替换或删除。

Fragment的相关操作

对于Fragment的相关操作,都是通过FragmentManager和FragmentTransaction来进行性的。

(1)如何将一个Fragment替换为另一个Fragment

FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.replace(R.id.layout_fragments,fragment);
transaction.commit();

(2)如何将Fragment存入栈中

FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.replace(R.id.layout_fragments,fragment);
transaction.addToBackStack(null);
transaction.commit();

(3)添加一个Fragment

FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.add(R.id.layout_fragments,fragment);
transaction.commit();

如果多个Fragment在同一个父容器中同时存在,且显示,则画面重叠。

(4)移除一个Fragment

FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.remove(fragment);
transaction.commit();

(5)隐藏一个Fragment

FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.hide(fragment);
transaction.commit();

(6)显示一个Fragment

FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.show(fragment);
transaction.commit();

(7)与Activity间的通信

从Activity中获取Fragment

(FragmentXXX)getSupportFragmentManager().findFragmentById(R.id.fragmentID);

从Fragment中获取Activity

(ActivityXXX)getActivtiy();

需要注意的是,一个transaction只能commit()一次。

Fragment的生命周期

从Fragment的产生到其消亡,整个生命周期依次经历以下步骤。

addFragment:添加Fragment
onAttach:绑定父容器
onCreate:创建对象
onCreateView:创建View
onViewCreated:完成View的创建
onActivityCreated:完成父容器创建
onStart:准备前台显示
onResume:前台显示
onHiddenChanged(true):隐藏Fragment
onHiddenChanged(false):显示Fragment
onPause:暂停
onStop:停止
onDestroyView:销毁View
onDestroy:销毁对象
onDetach:取消绑定

需要注意的是,隐藏和显示,只有在状态发生变化时,才会调用onHiddenChanged方法。

addFragment,将依次经历以下流程

addFragment
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onStart
onResume

removeFragment,将依次经历以下流程

removeFragment
onPause
onStop
onDestroyView
onDestroy
onDetach

replaceFragment,将依次经历以下流程(将Fragment A替换为Fragment B)

replaceFragment
FragmentB: onAttach
FragmentB: onCreate
FragmentA: onPause
FragmentA: onStop
FragmentA: onDestroyView
FragmentA: onDestroy
FragmentA: onDetach
FragmentB: onCreateView
FragmentB: onViewCreated
FragmentB: onActivityCreated
FragmentB: onStart
FragmentB: onResume

可见,replace是add和remove的组合。先创建要添加的对象B,移除对象A,然后继续创建对象B的View,然后显示B。

那么用Fragment A 替换 Fragment A本身呢?

replaceFragment

Android还是很智能的,若替换的Fragment为其本身,则什么都不做。

另外需要说明的是,不要在Activity的onCreate中试图获取Fragment中的控件变量。因为Fragment的初始化,在Activity的onCreate之后调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值