什么是Fragment

image.png
image.png
image.png

Fragment特点

1、Fragment作为Activity界面的一部分组成出现; 
2、可以在一个Activity中同时出现多个Fragment,并且一个Fragment亦可在多个Activity中使用;

3、在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace());

4、Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接受其所属的宿主Activity的生命周期控制。

Fragment的两种加载方式

(1)静态加载
image.png

注意

必须有android:id 和android:name这两个属性

(2)动态加载*

  • 1.创建一个Layout文件,就是Fragment的UI界面

  • 2.创建一个类继承Fragment,然后重写里面的onCreateView方法

  • 3.在Activity中获得一个事务FragmentManager

  • 4.创建事务FragmentTransaction

  • 5.动态创建Fragment,添加到事务里

  • 6.提交事务对象

Fragment生命周期

生命周期的对比
image.png

image.png

image.png

image.png

动态加载启动时

A===onCreate

A===onStart

Fragment=onAttach=

Fragment=onCreate=

Fragment=onCreateView=

Fragment=onActivityCreated=

Fragment=onStart=

A===onResume

Fragment=onResume=

静态加载启动时

A===onCreate

Fragment=onAttach=

Fragment=onCreate=

Fragment=onCreateView=

A===onStart

Fragment=onActivityCreated=

Fragment=onStart=

A===onResume

Fragment=onResume=

home键

A===onPause

A===onStop

Fragment=onStop=

再启动

A===onRestart

A===onStart

Fragment=onStart=

A===onResume

Fragment=onResume=

返回键

A===onPause

A===onStop

Fragment=onStop=

A===onDestroy

Fragment=onDestroyView=

Fragment=onDestroy=

Fragment=onDetach=

添加add

1、获得FragmentManager对象

FragmentManager supportFragmentManager = getSupportFragmentManager();

2、开始事务

FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();

3、添加Fragment (添加两个fragment,需要设置全部变量)

myFragment1 = new MyFragment1();

fragmentTransaction.add(R.id.frame,myFragment1);

4、提交FragmentManager

fragmentTransaction.commit();

移除remove

1、获得FragmentManager对象

FragmentManager supportFragmentManager = getSupportFragmentManager();

2、开始事务

FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();

3、移除Fragment

fragmentTransaction.remove(myFragment2);

4、提交FragmentManager

fragmentTransaction.commit();

替换replace


// **1、获得FragmentManager对象**

FragmentManager supportFragmentManager = getSupportFragmentManager();

//2、开始事务

FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();

//3、添加Fragment

//MyFragment3 myFragment3 = new MyFragment3();    fragmentTransaction.replace(R.id.frame,myFragment3);

// 4、提交FragmentManager

fragmentTransaction.commit();

##隐藏hide

1、获得FragmentManager对象

FragmentManager supportFragmentManager = getSupportFragmentManager();

2、开始事务

FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();

3、添加Fragment

// MyFragment3 myFragment3 = new MyFragment3();    fragmentTransaction.hide(R.id.frame,myFragment3);

4、提交FragmentManager

fragmentTransaction.commit();

显示show

1、获得FragmentManager对象

FragmentManager supportFragmentManager = getSupportFragmentManager();

2、开始事务

FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();

3、添加Fragment

// MyFragment3 myFragment3 = new MyFragment3();    fragmentTransaction.show(R.id.frame,myFragment3);

4、提交FragmentManager

fragmentTransaction.commit();

问题1

存在的问题:

1)如果需要重复使用该fragment,就需要每次都重新加载。比如我在第一个fragment中的EditText中输入数据后,然后切换到第二个fragment,然后再切换回来,就会造成数据丢失;

2)如果每切换一次就实例化一次的话,FragmentManager下的栈也会爆满,最终会导致手机卡顿,

解决方法先添加在隐藏:

    FragmentManager manager = getSupportFragmentManager();

    FragmentTransaction transaction = manager.beginTransaction();

    transaction.add(R.id.frame, myFragment2);

    transaction.add(R.id.frame, myFragment3);

    transaction.commit();

问题

存在的问题:

1)提前加载页面,浪费流量和资源;

优点:

2)提前加载页面,减少等待的过程。

先声明不创建

用到时在实例化

MyFragment2 myFragment2;

MyFragment3 myFragment3;
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐