Android Fragment

本文详细介绍了Android中的Fragment,包括其特点、优势、基本使用方法、动态添加到Activity的方式、Fragment的生命周期、与Activity的生命周期联系、回退栈的概念以及Fragment间通信的策略。重点讲解了如何在Activity中动态添加和管理Fragment,并强调了通过Activity中介进行Fragment间通信的重要性。

特点 :

  • Fragment是依赖于Activity的,不能独立存在的。
  • 一个Activity里可以有多个Fragment。
  • 一个Fragment可以被多个Activity重用。
  • Fragment有自己的生命周期,并能接收输入事件。
  • 我们能在Activity运行时动态地添加或删除Fragment。

Fragment的优势有以下几点:

  • 模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
  • 可重用(Reusability):多个Activity可以重用一个Fragment。
  • 可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

基本使用:

onCreateView(),该方法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_1, container, false);
        TextView view = root.findViewById(R.id.text);
        view.setText(mParam);
             return root;
    }    

将fragment添加到Activity

创建完Fragment后,接下来就是把Fragment添加到Activity中。在Activity中添加Fragment的方式有两种:

  • 静态添加:通过xml的方式添加,缺点是一旦添加就不能在运行时删除。
  • 动态添加:运行时添加,这种方式比较灵活,因此建议使用这种方式。
    虽然Fragment能在XML中添加,但是这只是一个语法糖而已,Fragment并不是一个View,而是和Activity同一层次的。

本文介绍的是动态添加的方式: 

在onCreate()中,通过以下代码将Fragment添加进Activity中。

if (bundle == null) {
    getSupportFragmentManager().beginTransaction()
        .add(R.id.container, Fragment1.newInstance("hello world"), "f1")        //.addToBackStack("fname")
        .commit();
}

这里需要注意几点:

  • 因为我们使用了support库的Fragment,因此需要使用getSupportFragmentManager()获取FragmentManager。

  • add()是对Fragment众多操作中的一种,还有remove(), replace()等,第一个参数是根容器的id(FrameLayout的id,即”@id/container”),第二个参数是Fragment对象,第三个参数是fragment的tag名,指定tag的好处是后续我们可以通过Fragment1 frag = getSupportFragmentManager().findFragmentByTag("f1")从FragmentManager中查找Fragment对象。

  • 在一次事务中,可以做多个操作,比如同时做add().remove().replace()

 

fragment生命周期

 fragment与activity生命周期间的联系

  • Fragment的onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()都是在Activity的onStart()中调用的。
  • Fragment的onResume()在Activity的onResume()之后调用。
  •  

Back Stack

    我们知道Activity有任务栈,用户通过startActivity将Activity加入栈,点击返回按钮将Activity出栈。Fragment也有类似的栈,称为回退栈(Back Stack),回退栈是由FragmentManager管理的。

    默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment事务加入回退栈,则可以加入addToBackStack("")。如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。

通信

1、Activity向fragment传递数据

    (1) 如果在创建Fragment时要传入参数,可通过setArguments(Bundle bundle)方式添加,可以在Fragment的onAttach()中通过getArguments()获得传进来的参数。也即通过bundle来传递数据

    (2)获取Fragment对象,并调用Fragment的方法即可,比如要将一个字符串传递给Fragment,则在Fragment中定义方法:

public void setString(String str) { 
    this.str = str;
}

并在Activity中调用fragment.setString("hello")即可。

2、fragment向Activity传递数据

定义一个用于传递信息的接口A,并设计好用于传递信息用的待实现函数。

在fragment中定义一个用于传递信息的函数B,该函数以A为参数,并调用A中的方法,将需要传递的数据作为函数参数传递进去

在Activity中调用fragment中的信息传递函数B,并实现用于信息传递的接口A,作为调用B的参数。在实现的接口A的函数中就可以接收并处理由fragment传递过来的数据了。

参考:https://cloud.tencent.com/developer/article/1394289

3、fragment之间传递数据

由于Fragment之间是没有任何依赖关系的,因此如果要进行Fragment之间的通信,建议通过Activity作为中介,不要Fragment之间直接通信。

Android Activity和Fragment之间的跳转方式

 

 

参考文献:https://www.jianshu.com/p/11c8ced79193

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值