Android学习笔记——Fragment

Fragment是Android 3.0引入的组件,用于大屏幕设备的UI模块化管理。它可以嵌入Activity中,有自己的生命周期并与Activity交互。Fragment的生命周期受Activity控制,常见的生命周期方法包括onCreateView()、onAttach()和onActivityCreated()。创建Fragment需要继承Fragment并实现相关回调方法。管理Fragment则涉及FragmentTransaction和FragmentManager,包括添加、删除和替换操作。Fragment与Activity之间的通信可以通过回调接口和Bundle数据传递实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fragment概述

  • Fragment,英文意思为“片段”,是Android 3.0(API 11)引入的新API, Fragment代表了Activity的子模块,Fragment必须被嵌入 用,同Activity类似, 它也拥有自己的生命周期!(异步刷新,教室学生分组)
  • 引入Fragment的初衷是为了适应大屏幕的平板电脑。由于平板电脑的屏 幕比手机屏幕更大,因此可以容纳更多的UI组件,开发者使用Fragment 对UI组件进行分组、模块化管理,可以更方便地在运行时过程中动态更 新Activity的用户界面。

注:Fragment特点是片段调用和模块复用,此类似HTML的FrameSet!

Activity 中可以调用 FragmentManager中的findFragmentById() 或者findFragmentByTag(),来获得Fragment,同时还可调用 add() remove() replace()去删除或者替换Fragment

注意一个Activity可以有多个Fragment,一个Fragment也可以被多个Activity使用

Fragment生命周期要受 Activity的生命周期也控制


Fragment的生命周期

  • 一共11个方法,根据需要选择性的重写指定方法,最常见的就是onCreateView()
  • 与Activity比较几个特殊的方法
    • onAttach(): 添加到Activity时被回调,与之相对的有onDetach()方法。
    • onCreateView():每次创建的View片段,与之相对的有onDestoryView()方法。
    • onActivityCreated():当Fragment所在的Activity被启动完成后回调该方法
  • 虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所 在Activity的生命周期控制。例如,当Activity暂停时,该Activity内的所有 Fragment都会暂停;当Actvity被销毁时,该Activity内的所有Fragment都 会被销毁。只有当该Activity处于活动状态时,程序员可通过方法独立地操作Fragment。
    生命周期示意图

创建Fragment

  • 与创建Actvity类似,实现的Fragment必须继承Fragment(或Fragment的子 类),且都需要实现与Activity类似的回调方法,例如onCreate()、 onCreateView()、onStart()、onResume()、onPause()、onStop()等等。通 常来说,创建Fragment通常需要实现如下三个方法:
    • onCreate():
      系统创建Fragment对象后回调该方法,实现代码中初始化想在Fragment 中保持的必要组件,当Fragment被暂停或者停止后可以恢复
    • onCreateView():
      当Fragment绘制界面组件时会回调该方法。该方法必须返回一个View, 该View也就是该Fragment所显示的View
    • onPause():
      当用户离开该Fragment时将会回调该方法

注:几个常见子类:DialogFragment、ListFragment、PreferenceFragment

  • 将创建的Fragment添加到Activity
    为了在Activity中显示Fragment,还必须将Fragment添加到Activity中。将 Fragment添加到Activity中有如下两种方式:
    • 在布局文件中使用

管理Fragment和处理Fragment事务

  • 管理Fragment
    Activity管理Fragment主要依靠FragmentManager对象,FragmentManager 对象可以通过getFragmentManager()获得:

    • 使用findFragmentById()或findFragmentByTag()方法来获取Fragment
    • 调用popBackStack()方法将Fragment从后台栈中弹出(模拟用户按下 BACK按键)(查看备注)
    • 调用addOnBackStackChangeListener()注册一个监听器,用户监听后台 栈的变化
    • 如需添加、删除、替换Fragment,则需要借助于FragmentTransaction对 象,FragmentTransaction代表Activity对Fragment执行的多个改变
    
    //主要Activity.java   FragmentOne.java    FragmentTwo.java    FragmentThree.java  ,都有一个输入框(默认输入一个值)和一个点击按钮,    按钮用于one-->two-->three跳转。
    
    //主界面跳转到one的时候:正常跳转
    FragmentManager fm = getFragmentManager();  
    FragmentTransaction tx = fm.beginTransaction();  
    tx.add(R.id.id_content, new FragmentOne(),"ONE");  
    tx.commit(); 
    //one到two的时候:  注意是 repalce并且加入了回退栈,不加,再按回退键会直接退出当前activity
    FragmentTwo fTwo = new FragmentTwo();  
    FragmentManager fm = getFragmentManager();  
    FragmentTransaction tx = fm.beginTransaction();  
    tx.replace(R.id.id_content, fTwo, "TWO");  
    tx.addToBackStack(null);  
    tx.commit();
    //two到Three的时候:注意是添加不是替换,同时加入回退栈。记住每一次都要修改输入框的值
    FragmentThree fThree = new FragmentThree();  
    FragmentManager fm = getFragmentManager();  
    FragmentTransaction tx = fm.beginTransaction();  
    tx.hide(this);  
    tx.add(R.id.id_content , fThree, "THREE");  
    tx.addToBackStack(null);  
    tx.commit();  
    
    
    //Three--》two:发现修改过的值  还在
    //two--》one   发现修改过的值不在了
    
    //推论出:    repalce  ==  remove+ add

替换Fragment及事务处理的示例

java
Fragment rightFragment = new RightFragment();
// 开启事务
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 执行替换
fragmentTransaction.replace(R.id.right_fragment, rightFragment);
// 将事务添加到back栈,允许用户按BACK按钮回到替换Fragment前的状态
fragmentTransaction.addToBackStack(null);
// 提交事务
fragmentTransaction.commit();


Fragment与Activity通信

  • Fragment与Activity交互
    *Fragment获取它所在的Activity:
    调用Fragment的getActivity()方法即可返回它所在的Activity。
    • Activity获取它所包含的Fragment:
      调用Activity关联的FragmentManager的findFragmentById(int id)或 findFragmentByTag(String tag)方法获取
  • 除此之外,Fragment与Activity可能还需要相互传递数据
    • Fragment向Activity传递数据:
      在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实 现该回调接口,这样Fragment即可调用该回调方法将数据传给Activity
    • Activity向Fragment传递数据:
      在Activity中创建Bundle数据包,并调用Fragment的setArgument(Bundle
      bundle)方法即可将Bundle数据包传给Fragment
    • Fragmeng向Fragment传递数据(结合第1)和第2)步)

github实例源码:https://github.com/mikelkl/FragmentTest

预览图:

预览图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值