Android开发 - Fragment 类子活动窗口详解
Fragment是什么
- Fragment 是 Android 开发中的一种模块化组件,一个抽象类,允许开发者将一个 Activity 分解成多个独立的、可重用的部分。每个 Fragment 都有自己的生命周期和用户界面,可以独立管理自己的 UI 和行为,它们可以动态地添加、移除或替换,从而提高应用程序的灵活性和可维护性
主要作用
-
可重用性:
- 可以在多个 Activity 中重用相同的 Fragment
-
灵活性:
- 可以动态地添加、移除或替换 Fragment,创建更灵活的用户界面
-
适配多种屏幕尺寸:
- 在大屏幕设备(如平板电脑)上,可以同时显示多个 Fragment,而在小屏幕设备(如手机)上,只显示一个 Fragment
生命周期
-
Fragment 的生命周期与 Activity 相似,但有一些额外的回调方法。以下是常见的生命周期方法:
-
onAttach:Fragment 被附加到 Activity 时调用.
-
onCreate:Fragment 被创建时调用
-
onCreateView:创建并返回与 Fragment 关联的视图层次结构
-
onActivityCreated:当 Activity 的 onCreate 方法返回时调用
-
onStart:Fragment 可见时调用
-
onResume:Fragment 可交互时调用
-
onPause:Fragment 不再交互时调用
-
onStop:Fragment 不再可见时调用
-
onDestroyView:销毁与 Fragment 关联的视图层次结构
-
onDestroy:Fragment 被销毁时调用
-
onDetach:Fragment 从 Activity 中分离时调用
-
代码步骤解析
-
创建主布局文件:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />
-
创建 Fragment 布局:
fragment_my.xml
<?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"> <!-- 在这里添加你的 UI 元素 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, Fragment!" android:textSize="18sp" /> </LinearLayout>
-
创建 Fragment 类:
MyFragment.java
// 导入必要的包 import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; //新建一个类,继承自 Fragment 类 public class MyFragment extends Fragment { // 重写 onCreateView 方法,创建 Fragment 的视图:定义 Fragment 的 UI @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 使用 inflater 将 fragment_my.xml 布局文件转换成 View 对象 return inflater.inflate(R.layout.fragment_my, container, false); } }
-
在 启动类 中加载 Fragment
// 导入必要的包 import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 设置主 Activity 的布局 // 检查是否存在 fragment_container 布局容器 if (findViewById(R.id.fragment_container) != null) { // 如果存在保存的实例状态,则不需要重新添加 Fragment if (savedInstanceState != null) { return; } // 创建 MyFragment 实例 MyFragment myFragment = new MyFragment(); // 使用 FragmentTransaction 将 MyFragment 添加到 fragment_container 中: //通过 FragmentTransaction 将 Fragment 加载到一个容器中(例如 FrameLayout) getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, myFragment).commit(); } } }
-
更新 启动类 与 Fragment 类让他们实现通信
-
Fragment 类
import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MyFragment extends Fragment { private TextView myTextView; // 重写 onCreateView 方法,创建 Fragment 的视图:定义 Fragment 的 UI @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 将布局文件转换成 View 对象 View view = inflater.inflate(R.layout.fragment_my, container, false); // 获取 TextView 的引用 myTextView = view.findViewById(R.id.my_text); // 获取传递过来的数据 Bundle args = getArguments(); if (args != null) { String text = args.getString("text"); myTextView.setText(text); } return view; } // 用于设置详细信息的方法 public void setText(String text) { if (myTextView != null) { myTextView.setText(text); } } }
-
启动类
// 导入必要的包 import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 设置主 Activity 的布局 // 检查是否存在 fragment_container 布局容器 if (findViewById(R.id.fragment_container) != null) { // 如果存在保存的实例状态,则不需要重新添加 Fragment if (savedInstanceState != null) { return; } // 创建 MyFragment 实例 MyFragment myFragment = new MyFragment(); // 创建一个 Bundle 对象用于传递数据 Bundle args = new Bundle(); args.putString("text", "这是传递给 MyFragment 的信息"); myFragment.setArguments(args); // 使用 FragmentTransaction 将 MyFragment 添加到 fragment_container 中: //通过 FragmentTransaction 将 Fragment 加载到一个容器中(例如 FrameLayout) getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, myFragment).commit(); } } }
-
- 以上成功创建和使用 Fragment,并实现主界面与 Fragment 之间的数据传递。Fragment 是一种非常强大的工具,能够帮助你构建更加灵活和可维护的 Android 应用程序