当前位置: 首页 > backend >正文

Fragment重要知识点总结

文章目录

        • 背景
        • 一、Fragment(碎片)
          • 1. 生命周期(重要)
          • 2. 基本用法
          • 3. 回退栈
          • 4. Fragment 与 Activity 交互(重要)
        • 二、ViewPager(视图滑动容器)
          • 1. 基本用法
          • 2. 适配器区别(重要)
          • 3. 关键注意事项
        • 三、RecyclerView(高效列表控件)
          • 1. 核心优势
          • 2. 基本使用步骤(重要)
          • 3. 布局管理器(LayoutManager)
          • 4. 其他核心组件
        • 小总结

背景

前面用到fragment实现过一个新闻app的首页,以及首页滑动选择4个选择栏分别是四个fragment,其中fragment知识点没有总结的比较细致,而且的话里面的内容部分并没有实现只是一个页面,所以这里补充一下知识点。

一、Fragment(碎片)

Fragment 是依赖于 Activity 的可复用 UI 组件,可动态组合页面,提升灵活性和内存效率。

1. 生命周期(重要)

Fragment 生命周期与 Activity 紧密关联,但包含更多细粒度方法,关键阶段及作用如下:

方法调用时机核心作用
onAttach()Fragment 与 Activity 关联时调用获取 Activity 引用,初始化参数(通过getArguments(),不可再调用setArguments())。
onCreate()Fragment 初次创建时调用初始化非 UI 数据(此时 Activity 可能未创建完成,不可依赖 Activity 资源)。
onCreateView()Fragment 构建 UI 视图时调用通过inflater.inflate()加载布局,返回视图(核心 UI 初始化)。
onActivityCreated()Activity 的onCreate()完成后调用可安全使用 Activity 资源(如获取 Activity 中的控件)。
onStart()Fragment 可见时调用(与 Activity 的onStart()同步)启动 UI 交互相关资源(如动画、传感器)。
onResume()Fragment 前台可交互时调用(与 Activity 的onResume()同步)准备用户交互(如注册点击监听)。
onPause()Fragment 失去焦点时调用(与 Activity 的onPause()同步)保存临时数据,暂停耗时操作。
onStop()Fragment 不可见时调用(与 Activity 的onStop()同步)释放非必要资源(如停止动画)。
onDestroyView()Fragment 视图销毁时调用解绑视图资源(下次显示需重新创建视图)。
onDestroy()Fragment 销毁时调用释放非视图资源(此时仍与 Activity 关联)。
onDetach()Fragment 与 Activity 解除关联时调用最终资源释放,Fragment 完全脱离 Activity。

与 Activity 生命周期对比:Fragment 的生命周期依赖于 Activity,如 Activity 的onStart()触发 Fragment 的onStart(),但 Fragment 多了onAttach()onCreateView()等 UI 相关方法。

2. 基本用法

Fragment 加载方式分为静态加载动态加载,动态加载更灵活(实际开发首选)。

  • 静态加载

    1. 定义 Fragment 布局(如example_fragment.xml)。
    2. 自定义 Fragment 类,重写onCreateView()加载布局。
    3. 在 Activity 布局中通过``标签引用,指定android:name为 Fragment 全类名。
    <fragmentandroid:id="@+id/fragment"android:name="com.example.ExampleFragment"android:layout_width="match_parent"android:layout_height="match_parent"/>
    
  • 动态加载(重要):

    1. Activity 布局中定义FrameLayout作为容器(占位符)。
    2. 通过FragmentManagerFragmentTransaction动态添加 / 替换 Fragment:
    // 步骤1:获取FragmentManager(若用v4包则用getSupportFragmentManager())
    FragmentManager fm = getFragmentManager();
    // 步骤2:开启事务
    FragmentTransaction transaction = fm.beginTransaction();
    // 步骤3:创建并添加Fragment到容器
    ExampleFragment fragment = new ExampleFragment();
    transaction.replace(R.id.fragment_container, fragment); // 替换容器中现有Fragment
    // 步骤4:提交事务
    transaction.commit();
    

FragmentTransaction 关键方法

  • add():添加 Fragment 到容器(不销毁现有 Fragment)。
  • replace():移除现有 Fragment 并添加新 Fragment(等效remove()+add())。
  • hide()/show():隐藏 / 显示 Fragment(不销毁视图,保留状态)。
  • addToBackStack(null):将事务加入回退栈(按返回键可恢复上一个 Fragment)。
3. 回退栈

默认情况下,Fragment 替换后会被销毁,通过回退栈可保留历史状态:

transaction.replace(R.id.container, newFragment).addToBackStack("tag") // 加入回退栈,标签用于标识.commit();
  • 作用:按返回键时,Fragment 会从onDestroyView()恢复到onCreateView()(视图重建,实例保留)。
  • 若用hide()+add()替代replace(),可避免视图重建(适合频繁切换场景)。
4. Fragment 与 Activity 交互(重要)
  • 组件获取

    • Fragment 获取 Activity 控件:getActivity().findViewById(R.id.xxx)
    • Activity 获取 Fragment 控件:getFragmentManager().findFragmentById(R.id.fragment).getView().findViewById(R.id.xxx)
  • 数据传递

    1. Activity → Fragment

      :通过

      Bundle
      

      传递,Fragment 中

      getArguments()
      

      获取:

      // Activity中
      ExampleFragment fragment = new ExampleFragment();
      Bundle bundle = new Bundle();
      bundle.putString("key", "value");
      fragment.setArguments(bundle);
      // Fragment中
      @Override
      public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);String data = getArguments().getString("key");
      }
      
    2. Fragment → Activity

      :通过接口回调:

      // Fragment中定义接口
      public interface OnDataListener {void onDataReceived(String data);
      }
      // 关联Activity时绑定接口
      @Override
      public void onAttach(Context context) {super.onAttach(context);listener = (OnDataListener) context;
      }
      // 触发回调传递数据
      listener.onDataReceived("data from fragment");
      // Activity实现接口
      public class MainActivity extends Activity implements ExampleFragment.OnDataListener {@Overridepublic void onDataReceived(String data) { /* 处理数据 */ }
      }
      
二、ViewPager(视图滑动容器)

ViewPager 用于实现左右滑动切换页面,常与 Fragment 结合实现多页面切换。

1. 基本用法
  1. 布局中添加 ViewPager:

    <androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp"android:layout_width="match_parent"android:layout_height="match_parent"/>
    
  2. 定义 Fragment 集合,创建适配器(FragmentPagerAdapterFragmentStatePagerAdapter)。

  3. 绑定适配器到 ViewPager:

    ViewPager vp = findViewById(R.id.vp);
    List<Fragment> fragments = new ArrayList<>();
    fragments.add(new Fragment1());
    fragments.add(new Fragment2());
    vp.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), fragments));
    
2. 适配器区别(重要)
适配器类型特点适用场景
FragmentPagerAdapter不销毁 Fragment 实例,仅销毁视图(onDestroyView()Fragment 数量少(如 3-4 个固定页面)
FragmentStatePagerAdapter销毁不再需要的 Fragment(onDetach()),通过onSaveInstanceState()保存状态Fragment 数量多(如列表分页)
3. 关键注意事项
  • 若使用 v4 包的 ViewPager,Fragment 需用androidx.fragment.app.Fragment,Activity 需继承FragmentActivity(如AppCompatActivity)。
  • 切换页面:vp.setCurrentItem(position)(跳转到指定页面)。
三、RecyclerView(高效列表控件)

RecyclerView 用于大量数据展示,相比 ListView 更灵活,支持多种布局和复用机制。

1. 核心优势
  • 标准化 ViewHolder 复用(无需手动setTag()/getTag())。
  • 插拔式布局管理(支持线性、网格、瀑布流)。
  • 可自定义分割线(ItemDecoration)和动画(ItemAnimator)。
2. 基本使用步骤(重要)
  1. 布局定义

    • Activity 布局添加 RecyclerView:

      <androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
      
    • 定义 Item 布局(如item_layout.xml)。

  2. 创建 Adapter 和 ViewHolder

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private List<String> mData;// ViewHolder:封装Item视图static class ViewHolder extends RecyclerView.ViewHolder {TextView textView;ViewHolder(View itemView) {super(itemView);textView = itemView.findViewById(R.id.item_text);}}// 构造方法:初始化数据public MyAdapter(List<String> data) { mData = data; }// 创建ViewHolder(加载Item布局)@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);return new ViewHolder(view);}// 绑定数据到ViewHolder@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {holder.textView.setText(mData.get(position));}// 返回数据总数@Overridepublic int getItemCount() { return mData.size(); }
    }
    
  3. 配置 RecyclerView

    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    // 1. 设置布局管理器(必选)
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); // 垂直列表
    recyclerView.setLayoutManager(layoutManager);
    // 2. 设置适配器(必选)
    recyclerView.setAdapter(new MyAdapter(dataList));
    // 3. 可选:添加分割线
    recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
    // 4. 可选:设置动画
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    
3. 布局管理器(LayoutManager)

RecyclerView 通过布局管理器控制 Item 排列方式,核心类型:

布局管理器特点适用场景
LinearLayoutManager线性排列(垂直 / 水平)类似 ListView 的列表布局
GridLayoutManager网格排列(指定列数)类似 GridView 的网格布局
StaggeredGridLayoutManager瀑布流排列(每行 / 列高度 / 宽度可变)不规则网格布局(如图片墙)

关键 API

  • setOrientation():设置滚动方向(垂直 / 水平)。
  • scrollToPosition(position):滚动到指定位置。
  • findFirstVisibleItemPosition():获取第一个可见 Item 位置(用于分页加载)。
4. 其他核心组件
  • ItemDecoration:自定义 Item 分割线(需继承RecyclerView.ItemDecoration,重写getItemOffsets()绘制间隔)。
  • ItemAnimator:控制 Item 增删动画(默认DefaultItemAnimator,可自定义)。
小总结
  1. Fragment:生命周期方法的调用时机(尤其是onCreateView()onActivityCreated())、动态加载步骤、回退栈作用、接口回调数据传递。
  2. ViewPagerFragmentPagerAdapterFragmentStatePagerAdapter的区别及适用场景。
  3. RecyclerView:Adapter 的三个核心方法(onCreateViewHolderonBindViewHoldergetItemCount)、LayoutManager 类型及作用、ViewHolder 复用机制。
  4. 交互逻辑:Fragment 与 Activity 的双向数据传递、RecyclerView 的焦点控制(TV 端需重写onInterceptFocusSearch实现循环滚动)。
http://www.xdnf.cn/news/18176.html

相关文章:

  • Incredibuild 新增 Unity 支持:击破构建时间过长的痛点
  • 机器学习(决策树2)
  • MVVM开源项目
  • Netty处理粘包与拆包
  • vue使用vue-cropper实现图片裁剪之单图裁剪
  • 关于mybatis表关联查询和mybatis-Plus单表查询传入时间查询数据(走索引)
  • Linux Namespace 隔离的“暗面”——故障排查、认知误区与演进蓝图
  • CVPR 2025 | 具身智能 | HOLODECK:一句话召唤3D世界,智能体的“元宇宙练功房”来了
  • 【HTML】3D动态凯旋门
  • 通过C#上位机串口写入和读取浮点数到stm32的片内flash实战4(通过串口下发AD9833设置值并在上位机显示波形曲线)
  • “你不干有的是AI干”,提示词中的“情感化提示”
  • 如何在 Ubuntu Linux 上安装 RPM 软件包
  • 【SQL优化案例】统计信息缺失
  • Vercel v0 iOS版重磅发布:AI驱动的移动开发新篇章
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘paramiko’问题
  • C++入门自学Day14-- Stack和Queue的自实现(适配器)
  • Java高级面试实战:Spring Boot微服务与Redis缓存整合案例解析
  • “R语言+遥感”的水环境综合评价方法实践技术应用
  • Centos7物理安装 Redis8.2.0
  • 【GNSS定位原理及算法杂记6】​​​​​​PPP(精密单点定位)原理,RTK/PPK/PPP区别讨论
  • 【部署相关】DockerKuberbetes常用命令大全(速查+解释)
  • 孩子王披露半年报:多数据持续增长,全年预期增强
  • git仓库和分支的关系
  • Linux GPIO子系统中开漏模式软件仿真机制的深度分析
  • 【深度学习计算性能】06:多GPU的简洁实现
  • 树状数组/差分数组/线段树/莫队算法介绍
  • 政务窗口服务满意度调查:服务型政府建设赋能方案(北京市场调研)
  • 2025年12大AI测试自动化工具
  • 电子电气架构 --- 软件项目风险管理
  • 「内力探查术」:用 Instruments 勘破 SwiftUI 卡顿迷局