背景

前面用到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 全类名。
    <fragment
        android: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 {
          @Override
          public void onDataReceived(String data) { /* 处理数据 */ }
      }
      
二、ViewPager(视图滑动容器)

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

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

    <androidx.viewpager.widget.ViewPager
        android: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.RecyclerView
          android: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布局)
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_layout, parent, false);
            return new ViewHolder(view);
        }
        // 绑定数据到ViewHolder
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.textView.setText(mData.get(position));
        }
        // 返回数据总数
        @Override
        public 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实现循环滚动)。
Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐