Bootstrap

【Fragment】安卓Android开发中的Activity、Fragment、Adapter

前面介绍了Activity,简单地说Activity代表着应用程序中的一个单独的屏幕或界面,用户可以与之交互。

那么现在就再来了解一下Fragment。

在安卓开发中,Fragment是一种可以嵌入到Activity中的可重用组件,用于构建灵活和模块化的用户界面。与Activity类似,Fragment具有自己的布局和生命周期,并且可以包含用户界面元素和逻辑。下面是关于Fragment的一些重要概念和特点:

灵活性

Fragment可以作为Activity的一部分进行管理,可以独立地添加、移除、替换或者组合在一起形成复杂的用户界面。

添加Fragment

  • 使用FragmentManager的beginTransaction()方法开始一个事务。
  • 使用add()方法将Fragment添加到Activity中,指定容器视图的ID和要添加的Fragment实例。
  • 最后调用commit()方法提交事务。
  • FragmentManager fragmentManager = getSupportFragmentManager();//获取与该Activity相关联的FragmentManager实例
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开始一个Fragment事务
    MyFragment fragment = new MyFragment();//创建要添加的Fragment实例
    fragmentTransaction.add(R.id.container, fragment);//将创建的Fragment实例添加到Activity中
    fragmentTransaction.commit();//提交Fragment事务,使添加操作生效
    

移除Fragment

  • 使用remove()方法将指定的Fragment从Activity中移除。
  • 最后调用commit()方法提交事务。
  • FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
    

替换Fragment

  • 使用replace()方法替换容器视图中的Fragment。
  • 最后调用commit()方法提交事务。
  • FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    MyFragment newFragment = new MyFragment();
    fragmentTransaction.replace(R.id.container, newFragment);
    fragmentTransaction.commit();
    

组合Fragment

  • 将多个Fragment添加到同一个Activity中,可以实现复杂的用户界面。
  • 可以使用布局文件或者代码动态地组合Fragment,以满足不同的布局需求。
  • FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    FragmentA fragmentA = new FragmentA();
    FragmentB fragmentB = new FragmentB();
    fragmentTransaction.add(R.id.container_a, fragmentA);
    fragmentTransaction.add(R.id.container_b, fragmentB);
    fragmentTransaction.commit();
    

生命周期

Fragment具有自己的生命周期,包括onCreate、onStart、onResume、onPause、onStop、onDestroy等方法,可以在这些方法中执行初始化、加载数据、处理用户交互等操作。

这里的生命周期中的方法与Activity的生命周期方法非常相似。

  • Activity 的生命周期方法适用于整个 Activity,包括其内部的所有 Fragment。
  • Fragment 的生命周期方法适用于 Fragment 自身及其 UI 元素,但不包括 Activity 中的其他 Fragment。
  • 在嵌套的情况下,Activity 的生命周期方法会在其包含的 Fragment 的生命周期方法之前调用。
  • Fragment 的生命周期方法是在其宿主 Activity 的生命周期方法之后调用的。

可重用性

Fragment是一种可重用的组件,可以在多个Activity中复用,也可以在同一个Activity中多次使用。

这种可重用性就带来了许多好处:

  1. 模块化设计:Fragment 的设计使得应用可以被分解为小的、可重用的模块,每个 Fragment 负责处理特定的 UI 和功能,从而使代码更具可维护性和可重用性。

  2. 代码复用:可以将常用的 UI 组件或功能封装在 Fragment 中,然后在多个 Activity 中共享。这样可以避免代码重复,提高开发效率。

  3. 适配不同设备:Fragment 可以根据不同的设备尺寸和方向动态调整其布局和行为,因此可以轻松实现多设备适配。

  4. 动态组合和交互:Fragment 可以在运行时动态地添加、移除或替换,以及动态地与其他 Fragment 进行通信和交互,从而实现灵活的用户界面设计。

  5. 模块化测试:由于 Fragment 可以单独测试,因此可以更轻松地对应用的不同部分进行单元测试,提高了代码的可测试性。

例如,在一个应用中,可以创建一个用于显示新闻列表的 NewsFragment,并在多个 Activity 中使用它。这样,无论用户是在手机上浏览新闻还是在平板电脑上浏览,都可以共享相同的新闻列表界面,并且无需在每个 Activity 中重复编写相同的布局和功能代码。

另外,也可以在同一个 Activity 中多次使用 Fragment,比如一个用于显示用户个人资料的 ProfileFragment,可以在同一个 Activity 中以不同的方式显示不同用户的个人资料,提高了界面的灵活性和可定制性。

布局

Fragment可以定义自己的布局文件,用于显示用户界面。布局文件可以包含各种UI控件,如按钮、文本框、列表等。

  1. XML 布局文件: 布局文件以 .xml 格式保存在项目的 res/layout 目录中。每个布局文件定义了一部分用户界面,可以包含各种 UI 元素,如按钮、文本框、图片视图等。

  2. UI 元素: 在布局文件中可以使用各种 UI 控件来构建用户界面,例如:

    • TextView:显示文本内容。
    • EditText:用于输入文本。
    • Button:触发操作的按钮。
    • ImageView:显示图像。
    • RecyclerView:显示列表或网格等可滚动内容。
    • 等等...
  3. 布局容器: 可以使用不同的布局容器来组织和排列 UI 元素,如:

    • LinearLayout:线性布局,可以水平或垂直排列子视图。
    • RelativeLayout:相对布局,子视图可以相对于父视图或其他视图进行定位。
    • ConstraintLayout:约束布局,使用约束来定义子视图之间的关系和位置。
    • FrameLayout:帧布局,用于在叠加视图中显示一个视图。
    • 等等...
  4. ID 和资源引用: 每个 UI 元素都可以指定一个唯一的 ID,以便在代码中引用。在布局文件中使用 android:id 属性来指定 ID。在代码中可以通过 findViewById() 方法来查找布局中的 UI 元素,并进行操作。

  5. 样式和主题: 布局文件可以引用样式和主题,以便统一界面的外观和风格。可以在布局文件或全局主题中指定样式。

  6. 包含其他布局: 布局文件可以包含其他布局文件,通过 <include><merge> 标签实现布局的复用和模块化。

通信

Fragment可以与其所在的Activity及其他Fragment进行通信,通过接口、回调、广播等方式实现数据传递和交互。

是指在不同组件之间传递数据或进行交互的过程。在 Android 开发中,Fragment 可以与其所在的 Activity 以及其他 Fragment 进行通信,以实现数据传递和交互。

以下是一些常见的 Fragment 通信方式:

  1. 接口(Interface): Fragment 可以定义一个接口,由 Activity 或其他 Fragment 实现,并通过该接口来传递数据或调用方法。具体步骤如下:

    • Fragment 定义接口:在 Fragment 中定义一个接口,并在合适的时机调用接口方法。
    • Activity 或其他 Fragment 实现接口:实现 Fragment 定义的接口,并处理接口方法。
    • 数据传递:Fragment 调用接口方法将数据传递给 Activity 或其他 Fragment。
  2. 回调(Callback): 类似于接口,通过回调机制实现 Fragment 与 Activity 或其他 Fragment 之间的通信。具体步骤如下:

    • Fragment 定义回调接口:在 Fragment 中定义一个回调接口,并提供注册和取消注册回调的方法。
    • Activity 或其他 Fragment 注册回调:在 Activity 或其他 Fragment 中实现回调接口,并在需要时注册到相应的 Fragment。
    • 数据传递:Fragment 调用注册的回调方法,将数据传递给注册的对象。
  3. 广播(Broadcast): 使用广播机制可以实现跨组件的数据传递和通知。Fragment 可以发送广播,Activity 或其他 Fragment 可以注册接收该广播并处理相应的数据。具体步骤如下:

    • Fragment 发送广播:使用 Intent 发送自定义广播,包含需要传递的数据。
    • Activity 或其他 Fragment 注册广播接收器:在 Activity 或其他 Fragment 中注册广播接收器,并实现对应的处理逻辑。
    • 数据传递:Fragment 发送广播时,Activity 或其他 Fragment 接收到广播并获取传递的数据。
  4. ViewModel: 使用 ViewModel 可以在 Fragment 和其关联的 Activity 之间共享数据,并且在配置变化(如屏幕旋转)时保持数据的一致性。具体步骤如下:

    • 创建 ViewModel:在 Activity 中创建 ViewModel 对象,并在需要共享的数据上存储数据。
    • Fragment 获取 ViewModel:Fragment 可以通过 ViewModelProviders 获取 Activity 关联的 ViewModel 对象。
    • 数据共享:Fragment 可以直接从 ViewModel 获取数据,也可以在 ViewModel 中提供方法供 Fragment 调用来修改数据。

适配器

适配器(Adapter)是连接数据和界面的桥梁,用于将数据适配到界面上显示。在 Android 中,Fragment 可以与适配器结合使用,常见的例子是与 ViewPager 配合使用 FragmentPagerAdapter 或 FragmentStatePagerAdapter,以实现可滑动的界面和动态加载。

具体来说,Fragment 与适配器结合使用有以下特点和优势:

  1. 数据适配

    • FragmentPagerAdapter 和 FragmentStatePagerAdapter 是专门用于 ViewPager 的适配器。
    • 这两种适配器可以将 Fragment 显示在 ViewPager 中,实现了 Fragment 的动态加载和销毁。
    • 适配器会根据 ViewPager 的滑动情况动态加载相邻的 Fragment,并在不需要时销毁以释放资源。
  2. 可滑动界面

    • 通过 ViewPager 和适配器,可以实现多个 Fragment 之间的水平滑动切换。
    • 这种可滑动的界面结构非常适合用于展示多个相关或独立的页面,例如导航页面、图片浏览器等。
  3. 懒加载

    • FragmentPagerAdapter 和 FragmentStatePagerAdapter 在 ViewPager 中使用时,会预加载 ViewPager 中的多个页面,因此称为“懒加载”。
    • 这样可以确保用户在切换页面时,下一个页面已经加载完毕,用户体验更加流畅。
  4. 动态加载

    • 当 ViewPager 中的页面太多时,FragmentStatePagerAdapter 可以动态销毁不再显示的 Fragment,从而节省内存。
    • 当用户再次滑动到这些页面时,适配器会重新加载相应的 Fragment,确保数据和界面的正确显示。

片段管理器

Fragment的生命周期由其所在的Activity管理,通过FragmentManager可以对Fragment进行添加、替换、移除、回退栈等操作。

以下是片段管理器的主要功能和作用:

  1. 管理 Fragment 的生命周期

    • 片段管理器负责调用 Fragment 的生命周期方法,如 onCreate()onStart()onResume() 等。
    • 当关联的 Activity 生命周期发生变化时,片段管理器会适时地调用 Fragment 的对应生命周期方法。
  2. 管理 Fragment 的添加和替换

    • 片段管理器可以将 Fragment 添加到 Activity 中,并在需要时进行替换。
    • 可以通过片段管理器的 add()replace() 方法来执行这些操作。
  3. 管理 Fragment 的移除

    • 可以通过片段管理器的 remove() 方法将 Fragment 从 Activity 中移除。
  4. 管理回退栈

    • 片段管理器可以管理回退栈,允许用户通过返回键回退到上一个 Fragment。
    • 使用 addToBackStack() 方法可以将 Fragment 添加到回退栈中。
  5. 查找 Fragment

    • 片段管理器可以通过标签或 ID 来查找和获取 Fragment 的实例。
    • 使用 findFragmentByTag()findFragmentById() 方法可以实现这一功能。
  6. 执行事务

    • 对 Fragment 的添加、替换、移除等操作都需要通过片段管理器执行事务(FragmentTransaction)。
    • 执行事务时可以设置事务的动画、添加到回退栈、添加到特定容器等。
  7. 异步操作

    • 片段管理器支持在主线程之外执行事务,例如在后台线程中进行 Fragment 的添加、替换等操作。

支持平台

Fragment是从Android 3.0(API级别11)开始引入的,并且在后续版本中得到了不断改进和增强。

总的来说,Fragment是Android开发中一种重要的界面组件,通过它可以实现更加灵活、模块化和可重用的用户界面,适用于构建各种复杂和交互性强的应用程序。

;