Activity中嵌套使用Fragment

Activity中嵌套使用Fragment

在Activity中添加Fragment

  1. 静态加载Fragment //此方法灵活性低,不常,也不建议使用

    • 新建自定义Fragment ,继承Fragment/ 开发环境自动生成 :

      package com.neostra.test;

      import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;

      import androidx.annotation.NonNull;
      import androidx.annotation.Nullable;
      import androidx.fragment.app.Fragment;

      public class FirstFregment extends Fragment {

         /*初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,
         但是不建议执行耗时的操作,比如读取数据库数据列表*/
         @Nullable
         @Override
         public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
             return inflater.inflate(R.layout.fragment_first,container,false);
        }

         /*在该方法内可以进行与Activity交互的UI操作*/
         @Override
         public void onActivityCreated(@Nullable Bundle savedInstanceState) {
             super.onActivityCreated(savedInstanceState);
             View view_01 = getActivity().findViewById(R.id.view_01);
             view_01.setBackgroundColor(getResources().getColor(R.color.red));
        }
         /*fragment生命周期中有很多方法,但目前主要用到这两个,其余方法参考链接
        https://blog.csdn.net/qq_46526828/article/details/107345410
         */
      }
    • 添加FirstFragment对应布局文件:

      <?xml version="1.0" encoding="utf-8"?>
      <androidx.constraintlayout.widget.ConstraintLayout 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"
         tools:context=".MainActivity2">

         <!-- TODO: Update blank fragment layout -->
         <View
             android:id="@+id/view_01"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:background="@color/black"/>

      </androidx.constraintlayout.widget.ConstraintLayout>
    • 在Activity对应布局中添加<fragment>标签 ,示例代码如下:

      <fragment
         android:name="com.neostra.test.FirstFregment"  //此属性值一定要为全限定类名
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

静态加载Fregment结束,需要多少个Fragment即添加多少个此标签,灵活性低 ,因此如下介绍 动态加载Fragment

  1. 动态加载Fragment //推荐使用

    • 新建自定义Fragment ,继承Fragment/ 开发环境自动生成 :

      package com.neostra.test;

      import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;

      import androidx.annotation.NonNull;
      import androidx.annotation.Nullable;
      import androidx.fragment.app.Fragment;

      public class FirstFregment extends Fragment {

         /*初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,
         但是不建议执行耗时的操作,比如读取数据库数据列表*/
         @Nullable
         @Override
         public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
             return inflater.inflate(R.layout.fragment_first,container,false);
        }

         /*在该方法内可以进行与Activity交互的UI操作*/
         @Override
         public void onActivityCreated(@Nullable Bundle savedInstanceState) {
             super.onActivityCreated(savedInstanceState);
             View view_01 = getActivity().findViewById(R.id.view_01);
             view_01.setBackgroundColor(getResources().getColor(R.color.red));

        }
      }
    • 添加FirstFragment对应布局文件:

      <?xml version="1.0" encoding="utf-8"?>
      <androidx.constraintlayout.widget.ConstraintLayout 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"
         tools:context=".MainActivity2">

         <!-- TODO: Update blank fragment layout -->
         <View
             android:id="@+id/view_01"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:background="@color/black"/>

      </androidx.constraintlayout.widget.ConstraintLayout>
    • 在Activity对应布局中添加一个自定义布局并赋予id,作为Fragment的容器

      <LinearLayout
         android:id="@+id/freg_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="horizontal"/>
    • 在需要动态加载Fragment的Activity 中做如下操作:

      public void onClick(View view) {
         /*点击对应按钮,跳转到指定的Fragment*/
         switch (view.getId()){
             case R.id.pref_01:
                 /*getSupportFragmentManager() : 获取到FragmentManageer对象,用于开启事务
                   beginTransaction()   : 开启事务
                   replace(参数1,参数2) : 替代Fregment容器中的视图, 参数1为Fragment容器的id,参数2 为目标Fregment对象
                   commit(); 提交事务
                  //注:关于为什么要用到事务,我的理解是与Fragment和Activity的生命周期有关,Activity不存在了,Fragment也就消失了
                 * */
                 getSupportFragmentManager().beginTransaction().replace(R.id.freg_container,new FirstFregment()).commit();
                 break;
             case R.id.pref_02:
                 getSupportFragmentManager().beginTransaction().replace(R.id.freg_container,new SecFragment()).commit();
                 break;
             case R.id.pref_03:
                 getSupportFragmentManager().beginTransaction().replace(R.id.freg_container,new ThirdFragment()).commit();
        }
    •  
posted @ 2022-05-05 18:15  安妍  阅读(902)  评论(0编辑  收藏  举报