Android开发 - Fragment 类子活动窗口详解

Fragment是什么

  • Fragment 是 Android 开发中的一种模块化组件,一个抽象类,允许开发者将一个 Activity 分解成多个独立的可重用的部分。每个 Fragment 都有自己的生命周期用户界面,可以独立管理自己的 UI行为,它们可以动态地添加移除替换,从而提高应用程序的灵活性可维护性

主要作用

  • 可重用性

    • 可以在多个 Activity重用相同的 Fragment
  • 灵活性

    • 可以动态添加移除替换 Fragment,创建更灵活的用户界面
  • 适配多种屏幕尺寸

    • 大屏幕设备(如平板电脑)上,可以同时显示多个 Fragment,而在小屏幕设备(如手机)上,只显示一个 Fragment

生命周期

  • Fragment 的生命周期与 Activity 相似,但有一些额外的回调方法。以下是常见的生命周期方法

    1. onAttachFragment 被附加到 Activity 时调用.

    2. onCreateFragment 被创建时调用

    3. onCreateView创建并返回Fragment 关联的视图层次结构

    4. onActivityCreated:当 ActivityonCreate 方法返回时调用

    5. onStartFragment 可见时调用

    6. onResumeFragment 可交互时调用

    7. onPauseFragment 不再交互时调用

    8. onStopFragment 不再可见时调用

    9. onDestroyView销毁Fragment 关联的视图层次结构

    10. onDestroyFragment 被销毁时调用

    11. onDetachFragmentActivity分离时调用

代码步骤解析

  1. 创建主布局文件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" />
    
  2. 创建 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>
    
  3. 创建 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);
        }
    }
    
  4. 启动类加载 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();
            }
        }
    }
    
  5. 更新 启动类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 应用程序
posted @ 2024-08-03 20:43  阿俊学JAVA  阅读(39)  评论(0编辑  收藏  举报