【Android从零单排系列三十六】《Android四大组件——Fragment》

2023-07-17 20:34:11 浏览数 (2)

前言

小伙伴们,在上文中我们介绍了Android组件Activity,本文我们继续盘点介绍Android开发中另一个非常重要的组件Fragment。

一 Fragment基本介绍

Android Fragment是Android应用开发中的一种重要组件,用于构建灵活且可重用的用户界面模块。Fragment可以看作是Activity内部的一部分,具有自己的布局、生命周期和交互行为。

通过使用Fragment,可以将应用程序的界面划分为多个独立的模块,每个模块负责显示特定的UI内容和逻辑。这使得开发者能够更好地管理复杂的界面布局和响应用户交互。

Fragment有以下几个主要特点:

  1. 独立性:Fragment具有独立的生命周期,并且可以被添加到或移除出Activity,也可以在不同的Activity之间共享。
  2. 可嵌套性:一个Fragment可以包含另一个Fragment,形成层级结构,方便实现模块化的UI设计。
  3. 生命周期管理:Fragment的生命周期与其所附属的Activity相互关联,可以通过回调方法进行处理。
  4. 界面灵活性:Fragment可以拥有自己的布局文件,通过FragmentManager进行动态添加、替换和移除等操作,从而实现动态的界面切换和更新。

二 Fragment使用方法

使用Fragment需要以下步骤:

  1. 创建Fragment类:创建一个继承自Fragment的Java类,并实现必要的方法。其中包括onCreateView()方法用于创建和返回Fragment的布局。
  2. 定义Fragment布局:在res/layout目录下创建Fragment的布局文件,定义界面元素和样式。
  3. 在Activity中使用Fragment:
    • 在Activity的布局文件中添加一个占位符View,用于容纳Fragment。
    • 在Activity的Java代码中通过FragmentManager管理Fragment,常见操作有:
      • 动态添加Fragment: 使用FragmentTransaction的add()方法将Fragment添加到指定的View中。
      • 替换Fragment: 使用FragmentTransaction的replace()方法替换指定的View中的Fragment。
      • 移除Fragment: 使用FragmentTransaction的remove()方法将指定的Fragment从View中移除。
    • 可以通过获取FragmentManager并调用beginTransaction()开始一系列Fragment事务,然后使用commit()提交事务。
  4. 处理Fragment生命周期:在Fragment类中,可以重写一些生命周期回调方法,如onCreate()、onStart()、onResume()等,来处理与Fragment相关的逻辑和数据操作。

总结起来,使用Fragment的基本步骤是:创建Fragment类、定义Fragment布局、在Activity中管理Fragment,并处理Fragment的生命周期。

三 Fragment常见属性及方法

常见属性:

  1. getArguments(): 获取传递给Fragment的参数Bundle。
  2. getActivity(): 获取所属的Activity。
  3. getContext(): 获取上下文Context。
  4. getView(): 获取Fragment的根视图View。
  5. getResources(): 获取资源对象,例如字符串、颜色等。

常见方法(部分):

  1. onCreate(Bundle savedInstanceState): Fragment被创建时调用,可以初始化一些数据和设置。
  2. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState): 创建Fragment的视图层次结构,通常在这个方法中通过LayoutInflater从布局文件中填充并返回Fragment的根视图View。
  3. onViewCreated(View view, Bundle savedInstanceState): 当Fragment的视图已经被创建后调用,可以进行与视图相关的初始化操作。
  4. onActivityCreated(Bundle savedInstanceState): 当所属的Activity的onCreate()完成后调用,可进行与Activity相关的初始化操作。
  5. onStart(): Fragment可见时调用。
  6. onResume(): Fragment获得焦点且可与用户交互时调用。
  7. onPause(): Fragment失去焦点且不再与用户交互时调用。
  8. onStop(): Fragment不可见时调用。
  9. onDestroyView(): Fragment的视图层次结构被移除时调用。
  10. onDestroy(): Fragment销毁时调用。
  11. onDetach(): Fragment与Activity解除关联时调用。

四 Fragment简单案例

以下是一个简单的Fragment使用案例,包括创建Fragment类、定义布局文件、在Activity中管理Fragment:

创建Fragment类:

代码语言:javascript复制
public class MyFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 使用布局文件fragment_my.xml填充视图
        return inflater.inflate(R.layout.fragment_my, container, false);
    }
}

定义布局文件fragment_my.xml:

代码语言:javascript复制
<!-- fragment_my.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <TextView
        android:id="@ id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is a fragment"></TextView>
        
</LinearLayout>

在Activity中管理Fragment:

代码语言:javascript复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();

        // 开始Fragment事务
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        // 创建并添加Fragment到指定的View
        MyFragment fragment = new MyFragment();
        fragmentTransaction.add(R.id.fragment_container, fragment);

        // 提交事务
        fragmentTransaction.commit();
    }
}

在Activity布局文件中添加占位符View:

代码语言:javascript复制
<!-- activity_main.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Fragment的容器View -->
    <FrameLayout
        android:id="@ id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

通过上述步骤,我们创建了一个MyFragment类作为Fragment,并在其中填充了布局文件fragment_my.xml。然后在MainActivity中,使用FragmentManager进行Fragment事务管理,在指定的View中添加了这个Fragment。通过这个案例,我们可以在Activity中动态加载和显示Fragment的布局和内容。

五 总结

  1. Fragment是Activity的一部分:
    • Fragment可以看作是Activity内部的模块或子页面,与Activity有生命周期和交互行为。
    • 一个Activity可以包含多个Fragment,并且可以在运行时动态地添加、替换、移除Fragment。
  2. 布局和视图:
    • 每个Fragment可以拥有自己的布局文件,通过onCreateView()方法返回填充的View对象。
    • 在Fragment中可以像处理Activity的界面一样操作和管理UI元素,例如设置监听器、修改内容等。
  3. 生命周期:
    • Fragment具有自己的生命周期,包括onCreate()、onCreateView()、onStart()、onResume()、onPause()、onStop()、onDestroyView()、onDestroy() 等方法。
    • Fragment的生命周期受到所属Activity的生命周期影响,它们之间存在关联。
  4. Fragment的通信:
    • Fragment可以通过在Activity中定义接口,在Activity和其他Fragment之间进行通信。
    • 一个Fragment可以通过getActivity()方法获取所属的Activity,从而与Activity进行交互。
  5. Fragment回退栈:
    • 可以将Fragment添加到回退栈中,并通过后退按钮(物理或虚拟)或代码控制来恢复前一个Fragment状态。
    • 使用回退栈可以实现Fragment之间的导航和切换。
  6. 动态管理:
    • 可以在运行时动态添加、替换、移除Fragment,从而实现灵活的界面交互。
    • FragmentTransaction用于管理Fragment的动作,并通过FragmentManager执行事务操作。
  7. 适配不同屏幕尺寸:
    • Fragment可以帮助应对屏幕旋转、多窗口模式等配置变化,保持数据和界面的一致性。
    • 使用Fragment可以更好地支持平板电脑和大屏设备的布局适配。

使用Fragment可以更好地组织代码、提高代码复用性,并实现灵活多样的用户界面。它在Android开发中广泛应用于构建复杂而功能丰富的应用程序。

0 人点赞