首页 > 其他分享 >Android开发 - Fragment 类详解

Android开发 - Fragment 类详解

时间:2024-08-03 20:50:07浏览次数:7  
标签:container Fragment Bundle fragment 详解 MyFragment import Android

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 应用程序

标签:container,Fragment,Bundle,fragment,详解,MyFragment,import,Android
From: https://www.cnblogs.com/ajunjava/p/18341035

相关文章

  • Rockchip rk3588-Android tv-红外接收调试
    参考:https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6/zh#ADB.E7.9A.84.E4.BD.BF.E7.94.A8https://www.cnblogs.com/ningci/p/15256839.htmlhttps://wiki.t-firefly.com/zh_CN/Firefly-RK3288/driver_ir.html开发板:Nanopc-T6系统:Android12TV工具:Xshell7、开心电视......
  • Android开发 - DetailFragment 类解析
    DetailFragment是什么DetailFragment专门用于显示详细信息。当用户在主界面(例如一个列表)中选择某个项时,应用会使用DetailFragment显示该项的详细信息。它通常与主界面的Fragment协同工作,形成一个主从结构(Master-Detail)使用场景新闻应用:主界面显示新闻列表,DetailFrag......
  • 【leetcode详解】正方形中的最多点数【中等】(C++思路精析)
    思路精析:自定义结构体解读:一个点是否在题给正方形中,只取决于其横纵坐标的最大值,记为dis沟通二位数组points和字符串s的桥梁,就是这个点的序号,记为idx由此自定义结构体,储存dis和idx//其中booloperator部分的功能:重载小于操作符“<”,使sort(vc.begin(),vc.end());按dis......
  • android studio 2022配置加速
    当前版本AndroidStudioFlamingo|2022.2.1Build#AI-222.4459.24.2221.9862592,builtonMarch31,2023Runtimeversion:17.0.6+0-b2043.56-9586694amd64VM:OpenJDK64-BitServerVMbyJetBrainss.r.o.Windows1010.0GC:G1YoungGeneration,G1OldGeneratio......
  • MySQL的执行计划详解(Explain)(整合版)
    目录MySQL的执行计划详解(Explain)(整合版)1、MySQL执行计划的定义2、Explain分析示例3、语法展示4、explain中的列4.1、id4.2、select_type4.3、table4.4、type(重要的)4.5、possible_keys4.6、key4.7、key_len4.8、ref4.9、rows4.10、fitered4.11、ExtraMySQL的执行计划详解(Expla......
  • 曲线取经Android SDK
    本文已经失效了,现在可以很快地从AndroidStudio下载所需的SDK。目前保留本文,以备不时之需。上下文在装AndroidStudio时,或者说无论干啥,想开发Android就需要AndroidSDK。有人说可以直接用什么镜像作为代理,但没用。所以,我突然想到我本来就有AndroidSDK,是安装VisualStudio时顺带......
  • Android开发 - (适配器)ArrayObjectAdapter类与Presenter实现类关联的作用解析
    ListRowPresenterArrayObjectAdapteradapter=newArrayObjectAdapter(newListRowPresenter());用途:用于展示ListRow中的水平滚动列表项ImageCardViewPresenterArrayObjectAdapteradapter=newArrayObjectAdapter(newImageCardViewPresenter());用途:用于显示带......
  • Android Studio开发学习(二、注册存储)
    用户注册首先我们创建一个新的Activity,将他命名为RegisterActivity我们还是先设计注册界面布局(根据自身喜好),我这里延用了上一篇透明框布局bg_username、btn_left、btn_right上一篇我们已经简单介绍了LinearLayout、TextView、EditText功能,这里补充一下Button布局,它决定按钮......
  • 【Android驱动07】Sensor传感器框架以及驱动移植和调试方法(Hal层部分)
    一,Androidsensor系统架构Hal就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(UserSpace),一层放在内核空间(KernelSpace),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。二,HAL层Sen......
  • Android开发 - ListRow类解析
    ListRow是什么ListRow是AndroidTV开发中的一个类,用于在应用的用户界面中显示水平滚动的项(如卡片、图像等)列表。它通常在一个BrowseFragment或RowsFragment中使用,以组织和显示内容//创建一个BrowseFragment实例BrowseFragmentbrowseFragment=newBrowseFragment......