读书笔记 | Fragment

一、概述

Fragment 是 Android 3.0 中引入的一个控件,主要是为了适应不同尺寸设备的 UI 设计,例如在手机和平板中我们就可以通过使用一套 UI 进行两种布局了,如下图所示:
在这里插入图片描述
当然它的作用不止于此,它还被广泛地应用于多页面的情况,通过 Fragment 就可以通过一个 Activity 进行多页面的管理,而不需要一个页面就创建一个 Activity,这样子可以极大地节约我们内存的开销。

讲完 Fragement 的用途之后,接下来说一下 Fragment 的一些注意事项:

  • Fragment 无法独立存在,它必须依托在 Activity 中才能进行显示和操作。
  • Fragment 拥有独立的生命周期,它的生命周期和 Activity 的生命周期非常相似,但它的生命周期是受宿主 Activity 的影响的。
  • Fragment 我们可以当作一个迷你的 Activity,但是它本身并不属于 Android 四大组件的范畴,所以它不需要在 AndroidManifest.xml 中进行注册。

在了解了注意事项后,我们接下来看看 Fragment 的生命周期图。

二、Fragment 的生命周期

Android 官方文档对 Fragment 生命周期的描绘如下所示:
在这里插入图片描述在这里插入图片描述
左图的生命周期方法介绍如下:

  • onAttachFragmentActivity 建立关联时调用。
  • onCreate:创建 Fragment 时调用。
  • onCreateView:加载 Fragment 布局的时候调用。
  • onActivityCreated:相关联的 Activity 创建完毕后调用。
  • onStart:此时 Fragment 可见,但还位于后台,无法与用户进行交互。
  • onResume:此时 Fragment 可见并且可以与用户进行交互了。
  • onPause:此时 Fragment 失去焦点。
  • onStop:此时 Fragment 处于完全不可见状态,准备停止。
  • onDestroyView:销毁 Fragment 的视图的时候调用。
  • onDestroy:销毁 Fragment 的时候调用。
  • onDetachFragmentActivity 解除绑定的时候调用。

完整生命周期方法调用顺序如下所示:

1.打开界面:

2.按下 Home 键退回桌面
在这里插入图片描述
3.再次回到界面
**onStart -> onResume**

4.按 Back 键退出
在这里插入图片描述

Fragment 是由 Activity 进行管理的,当 Fragment 加入 Activity 后,它们之间关系如下:

1.打开界面:
在这里插入图片描述
2.按下 Home 键退回桌面
在这里插入图片描述
3.再次回到界面
在这里插入图片描述
4.按 Back 键退出
在这里插入图片描述

三、Fragment 的加载

Fragment 的加载可分为静态加载和动态加载。

1. 静态加载

Activitylayout 文件中声明 Fragment,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.marck.fragmenttest.FragmentTest"/>

</LinearLayout>

在布局中添加 fragment 标签,并在 name 属性上添加我们想要添加的 Fragment。它的优点是使用简单,缺点却也很明显,就是不够灵活,直接占用了 Activity 的一块区域。

2. 动态加载

动态加载是指通过代码的形式添加 Fragment,只需要在 Activity 中留一块区域供 Fragment 加载,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/layout_fragment"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

然后在代码中,通过 FragmentManagerFragmentTransaction 来添加 Fragment,具体代码如下所示:

fragment = new FragmentTest();  // 待添加的 Fragment
FragmentManager manager = getFragmentManager();  // 通过 getFragmentManager 方法获取 FragmentManager
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.add(R.id.layout, fragment);  // 调用 add 方法添加 Fragment
transaction.commit();  // 最后调用 commit 进行提交

步骤如下:

  1. 通过 getFragmentManager 方法获取 FragmentManager 的实例。
  2. 通过 FragmentManager#beginTransaction 方法获取 FragmentTransaction 实例。
  3. 调用 FragmentTransaction#add 方法添加 Fragment,该方法第一个参数为添加的布局 id,第二个参数就是 Fragment 实例。
  4. 添加完成后一定要调用 FragmentTransaction#commit 提交!

FragmentTransaction 还有如下方法,介绍如下:

  • add:每次都会新创建 Fragment 实例
  • remove:将指定的 Fragment 实例进行销毁
  • show:将已存在的 Fragment 实例展示出来
  • hide:将已存在的 Fragment 实例隐藏
  • detach:执行这个方法只是销毁了 Fragment 的 UI 部分,但 Fragment 还存在
  • attach:将销毁了 UI 的 Fragment 的视图进行重绘,还原 Fragment
  • replace:将旧的 Fragment 实例销毁,并创建新的 Fragment 实例,相当于 remove + add 的组合

日常使用过程中 addshow/hide 应当是使用最多的,add 用于第一次加载 Fragment 实例,然后通过 show/hide 进行相应的显示和隐藏。虽然相比其它方法 show/hide 会占有更多的内存,但是它们能使应用页面之间的切换变得快和流畅,带给用户更好的体验。

四、Fragment 和 Activity 之间的通信

FragmentActivity 之间的通信分为 2 个部分:

1. 在 Activity 中管理 Fragment

要在 Activity 中管理 Fragment,最重要的就是要获取要管理的 Fragment 的实例,获取方式如下:

FragmentManager manager = getFragmentManager();
FragmentTest fragment = (FragmentTest) manager.findFragmentById(R.layout.fragment_test);

通过 findFragmentById 方法即可获得相应的 Fragment 实例,除此之外还可以通过 findFragmentByTag 方法获得相应实例,调用这个方法的前提是我们在添加 Fragment 时为其设置了 Tag

2. 在 Fragment 中调用 Activity 的方法

Fragment 中获取 Activity 的实例也是比较简单的,通过 getActivity 方法即可获取宿主 Activity 的实例:

MainActivity activity = (MainActivity) getActivity();

获取得实例后我们就能在 Fragment 中调用 MainActivity 的相关方法了。

3. Fragment 与 Fragment 的通信

这种情况比较少见,如果非要进行 Fragment 之间的通信,可以通过在 Fragment 中先获取宿主 Activity 的实例,然后通过宿主 Activity 再获取另一个 Fragment 的实例,从而实现两个 Fragment 之间的通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android中,可以使用FragmentManager来管理Fragment的跳转。具体步骤如下: 1. 获取FragmentManager对象: FragmentManager fragmentManager = getSupportFragmentManager(); 2. 开始Fragment事务: FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 3. 创建要跳转的Fragment对象: MyFragment myFragment = new MyFragment(); 4. 调用FragmentTransaction的replace方法,将当前Fragment替换为要跳转的FragmentfragmentTransaction.replace(R.id.container, myFragment); 5. 调用FragmentTransaction的commit方法,提交事务: fragmentTransaction.commit(); 其中,R.id.container是一个FrameLayout,用于显示Fragment的布局容器。 ### 回答2: 在Android中,使用Fragment的一个常见的需求是在一个Fragment中点击某个按钮或者view后跳转到另一个Fragment,也就是所谓的Fragment跳转Fragment。 在实现这个需求之前,需要先明确一些基本概念。在Android中,使用Fragment的最基本的方式是使用FragmentTransaction来进行添加、移除、替换、隐藏等操作。当一个新的Fragment需要被展示时,也就是所谓的Fragment跳转Fragment时,我们需要使用FragmentTransaction来进行以下步骤: 1. 创建要跳转的Fragment实例。 2. 使用FragmentManager获取FragmentTransaction实例。 3. 调用FragmentTransaction的替换方法(replace)来将当前Fragment替换为要跳转的Fragment。 4. 添加到回退栈(addToBackStack)中。 5. 调用FragmentTransaction的提交方法(commit)来提交这一操作。 示例代码如下: ``` FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, new MyFragment()); transaction.addToBackStack(null); transaction.commit(); ``` 在这段代码中,我们使用了SupportFragmentManager来获取了一个FragmentTransaction对象,并将其替换为了新的Fragment,并将其添加到回退栈中。最后,调用了提交方法来提交这一操作。 需要注意的是,在跳转Fragment时,我们也可以传递一些数据给新的Fragment,例如某些参数、对象等。我们可以使用Bundle将这些数据打包传递给新的Fragment。在新的Fragment中,我们可以使用getArguments()方法获取这些数据。 总体来说,Fragment跳转Fragment是Android中常见的一种场景,使用FragmentTransaction进行操作可以轻松地实现这一需求。在进行操作时,需要注意保存当前状态并添加到回退栈中,以便用户可以使用返回按钮返回上一个Fragment。 ### 回答3: Fragment 跳转 Fragment 是指在一个 Fragment 中通过代码的方式启动另一个 Fragment。在实际开发中,这种方式常常被用于实现页面之间的跳转或者数据的传递等操作。 在 Android 中,Fragment 跳转 Fragment 有多种方式,其中最常用的方式是使用 FragmentManager 开启一个新的 Fragment,具体流程如下: 1. 首先需要获取到 FragmentManager 对象,可以通过 getActivity().getSupportFragmentManager() 方法获取当前 Fragment 所在的 Activity 的 FragmentManager 对象。 2. 创建一个新的 Fragment 对象,这个对象可以在 FragmentManager 中进行管理,在后面我们会用到。 3. 随着 Fragment 的增多,一个问题也就显现出来,如何在父 Fragment 中实现多个 Fragment 之间的切换?这个时候可以选择使用 FragmentTransaction 对象,通过 add()、replace() 等方法实现对 Fragment 的增删操作。 代码实现如下: // 获取 FragmentManager 对象 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); // 创建一个新的 Fragment 对象 SecondFragment fragment = new SecondFragment(); // 开启一个事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); // 通过 add()、replace() 等方法实现对 Fragment 的增删操作 transaction.replace(R.id.container, fragment); transaction.addToBackStack(null); // 提交事务,启动 Fragment transaction.commit(); 在这段代码中,R.id.container 表示存放 Fragment 的容器,这个可以根据实际需要进行修改。 同时,我们还需要注意 addToBackStack() 方法的使用。这个方法可以将当前 Fragment 加入 BackStack 中,也就是将当前 Fragment 放入到一个栈中,方便用户在返回时直接返回到上一个 Fragment。需要注意的是,如果不使用 addToBackStack() 方法,则用户在返回时会直接退出当前 Activity。 总之,Fragment 跳转 Fragment 功能十分重要,能够帮助开发者实现程序中各种场景的操作。通过 Fragment 嵌套来实现页面嵌套,通过 Fragment 之间的跳转来实现页面之间的切换,是 Android 开发中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值