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 加载方式分为静态加载和动态加载,动态加载更灵活(实际开发首选)。
-
静态加载:
- 定义 Fragment 布局(如
example_fragment.xml
)。 - 自定义 Fragment 类,重写
onCreateView()
加载布局。 - 在 Activity 布局中通过``标签引用,指定
android:name
为 Fragment 全类名。
<fragmentandroid:id="@+id/fragment"android:name="com.example.ExampleFragment"android:layout_width="match_parent"android:layout_height="match_parent"/>
- 定义 Fragment 布局(如
-
动态加载(重要):
- Activity 布局中定义
FrameLayout
作为容器(占位符)。 - 通过
FragmentManager
和FragmentTransaction
动态添加 / 替换 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();
- Activity 布局中定义
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)
。
- Fragment 获取 Activity 控件:
-
数据传递:
-
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"); }
-
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. 基本用法
-
布局中添加 ViewPager:
<androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp"android:layout_width="match_parent"android:layout_height="match_parent"/>
-
定义 Fragment 集合,创建适配器(
FragmentPagerAdapter
或FragmentStatePagerAdapter
)。 -
绑定适配器到 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. 基本使用步骤(重要)
-
布局定义:
-
Activity 布局添加 RecyclerView:
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
-
定义 Item 布局(如
item_layout.xml
)。
-
-
创建 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(); } }
-
配置 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
,可自定义)。
小总结
- Fragment:生命周期方法的调用时机(尤其是
onCreateView()
、onActivityCreated()
)、动态加载步骤、回退栈作用、接口回调数据传递。 - ViewPager:
FragmentPagerAdapter
与FragmentStatePagerAdapter
的区别及适用场景。 - RecyclerView:Adapter 的三个核心方法(
onCreateViewHolder
、onBindViewHolder
、getItemCount
)、LayoutManager 类型及作用、ViewHolder 复用机制。 - 交互逻辑:Fragment 与 Activity 的双向数据传递、RecyclerView 的焦点控制(TV 端需重写
onInterceptFocusSearch
实现循环滚动)。