【Android】Fragment的静态动态创建以及两种创建方式的生命周期

[复制链接]
发表于 2026-2-19 11:39:33 | 显示全部楼层 |阅读模式
参考:
  33.3-Fragment的创建-静态创建2_哔哩哔哩_bilibili
  Fragment的创建_从现有代码创建foutran-CSDN博客
  【Android】Fragment的根本用法、Fragment和活动间的通讯、Fragment的生命周期、动态加载布局的本事_android fragment-CSDN博客
  

Fragment的静态创建


  • 创建一个Fragment
  • 布局代码中用一个容器承接并绑定

    • fragment标签
    • FragmentContainView标签

先创建一个导航界面

先创建一个带按钮的空缺界面吧!

然后创建一个Fragment

创建一个Activity用来承载Fragment

由于Fragment依赖于Activity存在,故而我们起首必要创建一个Activity用来承载fragment。
Be like:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     tools:context=".MainActivity2">
  9.    
  10.     <fragment
  11.         android:id="@+id/my_fragment"
  12.         android:layout_width="match_parent"
  13.         android:layout_height="match_parent"
  14.         android:name="com.example.fragment.fragment.StaticFragment1"/>
  15. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
做到这一步,还并没有感觉到Fragment跟平常的Activity有什么区别,我们给fragment加点控件再看看。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:tools="http://schemas.android.com/tools"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     android:orientation="vertical"
  7.     tools:context=".fragment.StaticFragment1">
  8.     <LinearLayout
  9.         android:layout_width="match_parent"
  10.         android:layout_height="wrap_content"
  11.         android:orientation="horizontal"
  12.         android:gravity="center_vertical">
  13.         <TextView
  14.             android:layout_width="wrap_content"
  15.             android:layout_height="wrap_content"
  16.             android:text="请给我的App打分吧!"
  17.             android:textSize="20sp"
  18.             android:id="@+id/tv_like"/>
  19.         
  20.         <RadioGroup
  21.             android:layout_width="wrap_content"
  22.             android:layout_height="wrap_content"
  23.             android:orientation="horizontal">
  24.             <RadioButton
  25.                 android:id="@+id/rb_notlike"
  26.                 android:layout_width="wrap_content"
  27.                 android:layout_height="wrap_content"
  28.                 android:text="不喜欢"/>
  29.             <RadioButton
  30.                 android:id="@+id/rb_verynotlike"
  31.                 android:layout_width="wrap_content"
  32.                 android:layout_height="wrap_content"
  33.                 android:text="特别不喜欢"/>
  34.         </RadioGroup>
  35.     </LinearLayout>
  36.     <RatingBar
  37.         android:layout_width="wrap_content"
  38.         android:layout_height="wrap_content" />
  39. </LinearLayout>
复制代码

在Fragment中完成变乱的绑定

先做成如许,而后去fragment的.java文件中举行控件的绑定。
fragment的绑定实在与Activity中的绑定比力相似,在Activity中的绑定每每是:

在这里写大概直接用ViewBinding工具。
而在fragment中:

可以看到上方的onCreateView函数负责引入布局,而控件的绑定必要我们重写onViewCreated函数,大概像如许:(趁便把变乱监听也写了)
  1. @Override
  2. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
  3.     super.onViewCreated(view, savedInstanceState);
  4.     tvlike =  view.findViewById(R.id.tv_like);
  5.     rbDislike = view.findViewById(R.id.rb_notlike);
  6.     rbVeryDislike = view.findViewById(R.id.rb_verynotlike);
  7.     rbStar = view.findViewById(R.id.rating_bar);
  8.     rbDislike.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  9.         @Override
  10.         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  11.             if(isChecked){
  12.                 tvlike.setText("我不喜欢这个");
  13.             }
  14.         }
  15.     });
  16.     rbVeryDislike.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  17.         @Override
  18.         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  19.             if(isChecked){
  20.                 tvlike.setText("我非常不喜欢这个");
  21.             }
  22.         }
  23.     });
  24.     rbStar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
  25.         @Override
  26.         public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
  27.             if (fromUser) {
  28.                 Toast.makeText(getActivity(), "你给我评了"+rating, Toast.LENGTH_SHORT).show();
  29.             }
  30.         }
  31.     });
  32. }
复制代码
注:这里也可以用ViewBinding举行绑定,笔者为了演示方便故而直接用的findViewById。
此时点击运行,就能正常使用啦!
在Activity中预览Fragment

我们再切换回创建的用于承载Fragment的Activity中。

可以看到,固然能运行,但是预览界面中我们是看不到的。
只必要加上这句话即可

可以预览界面了。
注意与额外事项

关于FragmentContainerView标签


谷歌现在更加保举开发者使用这个标签,专为Fragment计划,添加了一些关于生命周期烧毁以及规复的优化。
注意事项


  • Fragment标签必须声明 android:id 属性,否则会出标题
  • name属性可以用class属性代替
Fragment的动态创建


  • 创建一个Fragment
  • 布局代码中用一个容器来承接,但不直接绑定
  • 在代码中用FragmentManager、FragmentTransaction添加Fragment到容器
在Activity中设置一个容器


在Activity的代码中,设置动态创建Fragment的代码


  1. public class DynamicFragmentActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         EdgeToEdge.enable(this);
  6.         setContentView(R.layout.activity_dynamic_fragment);
  7.         ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
  8.             Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
  9.             v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
  10.             return insets;
  11.         });
  12.         if(savedInstanceState == null){
  13.             FragmentManager supportFragmentManager = getSupportFragmentManager();
  14.             FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
  15.             fragmentTransaction.add(R.id.fragment_container_view_tag, ExampleFragment1.class,null)
  16.                     .setReorderingAllowed(true)
  17.                     .addToBackStack(null)
  18.                     .commit();
  19.         }
  20.     }
  21. }
复制代码

  • if(savedInstanceState == null){:

    • 这是一个条件判定语句。savedInstanceState是一个Bundle对象,通常用于生存Fragment的实例状态。如果savedInstanceState为null,阐明Fragment是初次创建,而不是从生存的状态中规复。

  • FragmentManager supportFragmentManager = getSupportFragmentManager();:

    • 获取当前Activity的FragmentManager实例。FragmentManager用于管理Fragment的生命周期和变乱。

  • FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();:

    • 创建一个Fragment变乱(FragmentTransaction),用于实验添加、更换、删除Fragment等操纵。

  • fragmentTransaction.add(R.id.fragment_container_view_tag, ExampleFragment1.class,null):

    • 向FragmentManager中添加一个新的Fragment。R.id.fragment_container_view_tag是Fragment要添加到的容器视图的ID。ExampleFragment1.class是要添加的Fragment的类。null是用于标识Fragment的标签,这里传入null体现不使用标签。

  • .setReorderingAllowed(true):

    • 允许Fragment变乱中的视图重新排序。这通常用于动画效果,使Fragment的添加或更换看起来更平滑。

  • .addToBackStack(null):

    • 将这个Fragment变乱添加到退却栈中。用户可以通过按退却键来返回到这个Fragment变乱之前的状态。传入null体现不使用标签。

  • .commit();:

    • 提交Fragment变乱。这会触发Fragment的生命周期方法,如onCreate、onStart等,并终极将Fragment体现在界面上。

两种方式创建Fragment的生命周期的区别


Fragment生命周期

Fragment 的生命周期重要分为以下几个阶段:

  • onAttach(Context context)

    • 调用机遇:当Fragment被附加到Activity时。
    • 作用:可以在这里获取Activity的引用。

  • onCreate(Bundle savedInstanceState)

    • 调用机遇:在Fragment被创建时,通常在Activity的onCreate之后。
    • 作用:举行初始化操纵,如设置布局和初始化数据。

  • onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

    • 调用机遇:在Fragment的视图被创建时。
    • 作用:加载和返回Fragment的视图。

  • onViewCreated(View view, Bundle savedInstanceState)

    • 调用机遇:在Fragment的视图创建后,但在onStart之前。
    • 作用:可以在视图已经创建但还未体现时举行一些操纵。

  • onActivityCreated(Bundle savedInstanceState)

    • 调用机遇:在Activity的onCreate方法调用后。
    • 作用:可以访问Activity的初始化数据。

  • onStart()

    • 调用机遇:当Fragment开始与用户交互时。
    • 作用:开始动画或处理惩罚用户输入。

  • onResume()

    • 调用机遇:当Fragment可见并与用户交互时。
    • 作用:规复之前停息的操纵。

  • onPause()

    • 调用机遇:当Fragment不再与用户交互时。
    • 作用:停息动画或克制处理惩罚用户输入。

  • onStop()

    • 调用机遇:当Fragment不再可见时。
    • 作用:开释资源。

  • onDestroyView()

    • 调用机遇:当Fragment的视图被烧毁时。
    • 作用:烧毁视图相干的资源。

  • onDestroy()

    • 调用机遇:当Fragment被烧毁时。
    • 作用:开释全部资源。

  • onDetach()

    • 调用机遇:当Fragment从Activity中分离时。
    • 作用:清算与Activity的关联。

静态创建与动态创建的区别


  • 静态创建

    • 静态创建通常在Activity的布局文件中界说Fragment。
    • 生命周期方法按次序调用,从onAttach到onDetach。
    • 视图创建和烧毁的机遇与Activity的生命周期同等。

  • 动态创建

    • 动态创建是在代码中通过FragmentManager添加或更换Fragment。
    • 生命周期方法的调用次序大概会有所差别,比方:

      • Fragment在Activity的onCreate之前被创建。
      • Fragment的视图在Activity的视图创建之后才创建。
        Activity的布局文件中界说Fragment`。

    • 生命周期方法按次序调用,从onAttach到onDetach。
    • 视图创建和烧毁的机遇与Activity的生命周期同等。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表