Fragment使用以及生命周期

Fragment详解
Fragment是Android 3.0引入的概念,主要用于支持大屏幕设备的UI展示。它可以被视为Activity的一部分,拥有独立的生命周期,能够接收输入事件,并在Activity运行时动态地添加或移除。本文将详细介绍Fragment的使用方法、生命周期及如何在Activity中集成。

1 Fragment是什么?

         Frament也叫碎片,片段。是Google在Android 3.0引入的,主要为了给大屏幕的UI提供支持 的。

         Frament可以理解为一个迷你的Activity或者是Activity的模块化的组件,它有自己的生命周期与 显示界面,我们可以利用多个Frament嵌套在Activity达到以下的功能,如适配平板,或适配横竖 屏幕,或者在程序运行的过程中动态的更改我们的UI界面。如下图:

                上图是显示应用运行在手机情况下,从一个列表页面跳转到详细页面的例子。如果我们不使用 Fragment的情况,当应用运行在平板上面的情况,就只能显示放大版的手机显示的界面,为了 利用平板的特性,Android在3.0版本中提供了Fragment技术,我们就可以将列表与内容以组件 的方式插入,在手机上分屏显示两个内容,在平板上面就可以左右显示两个内容

 

                您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事 件,并且您可以在 Activity 运行时添加或删除片段(有点像您可以在不同 Activity 中重复使用 的“子 Activity”)。 

                片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。

   使用Fragment

 

如果需要使用Fragment的话,需继承Fragment类,

目前有两个Fragment类,

    1 android.support.v4.app.Fragment 

    2 android.app.Fragment 

如果继承Activity就获取不到getSupportFragmentManager();

 

      第一种是sdk提供的是3.0以上提供的类,第二是 android support v4 版本提供的向下兼容类,建 议使用第二个类。

     继承Fragment至少需实现以下方法:

     onCreateView() 系统会在片段首次绘制其用户界面时调用此方法,并将创建的UI界面返回 

 

使用Fragment

    在 Activity 的布局文件加入 fragment 控件

    在代码中通过编程方式将片段添加到某个现有ViewGroup

 在布局文件中添加一个Fragment   (属于静态添加fragment)

  <fragment android:name="继承了Fragment类的路径"   
     android:id="@+id/list"     
     android:layout_weight="1"    
     android:layout_width="0dp"   <!--在这里必须有一个标签tag  否则报错-->
     android:layout_height="match_parent" />

android:name 属性指定要在布局中实例化的 Fragment 类。注意如果是在xml中声明的 

Fragment的话,必须给这个Fragment设置id或者tag。 

 

使用代码添加一个Fragment到某个现有ViewGroup (属于动态添加fragment)

    <!--动态添加-->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/frist_fragment"/>
//获取到低版本兼容的FragmentManager
//getSupportFragmentManager();
//3.0之上的
// getFragmentManager();
FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();

//1,Fragment的Id   
//2,Fragment类   
//3,Fragment标签 标签必须添加
fragmentTransaction.add(R.id.frist_fragment,new FristFragment() ,"fragmentTag");

//最后一步一定要提交事务
fragmentTransaction.commit();

 

public class FristFragment extends Fragment{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Bundle bundle=getArguments();
        View view = inflater.inflate(R.layout.frast_fragment,null);
        return view;
    }
}

 

传值给Fragment

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        FragmentManager fragmentManager = getSupportFragmentManager();

        FristFragment frast = new FristFragment();
        //FragmentManager传值
        Bundle bundle=new Bundle();
        bundle.putString("title","传值成功");
        frast.setArguments(bundle);//传值

        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        //1,Fragment的Id   2,Fragment类   3,Fragment标签 标签必须添加
        fragmentTransaction.add(R.id.frist_fragment,frast,"fragmentTag");
        //最后一步一定要提交事务
        fragmentTransaction.commit();

    }
}
public class FristFragment extends Fragment{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Bundle bundle=getArguments(); //获取对象
        String title=bundle.getString("title");//对应标签
        View view = inflater.inflate(R.layout.frast_fragment,null);
        TextView textView=view.findViewById(R.id.textView);
        textView.setText(title);
        return view;
    }
}

 

    <!--动态添加-->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/frist_fragment"/>

 


Fragment的生命周期

 

Fragment每个生命周期方法的意义、作用(注意红色的不是生命周期方法):

函数说明
setUserVisibleHint()设置Fragment可见或者不可见时会调用此方法。在该方法里面可以通过调用getUserVisibleHint()获得Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。
onAttach()执行该方法时,Fragment与Activity已经完成绑定,该方法有一个Activity类型的参数,代表绑定的Activity,这时候你可以执行诸如mActivity = activity的操作。
onCreate()初始化Fragment。可通过参数savedInstanceState获取之前保存的值。savedInstanceState用户保存至比如切换横竖屏
onCreateView()初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,但是不建议执行耗时的操作,比如读取数据库数据列表。
onActivityCreated()执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。
onStart()执行该方法时,Fragment由不可见变为可见状态。
onResume()执行该方法时,Fragment处于活动状态,用户可与之交互。
onPause()执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。
onSaveInstanceState()保存当前Fragment的状态。该方法会自动保存Fragment的状态,比如EditText键入的文本,即使Fragment被回收又重新创建,一样能恢复EditText之前键入的文本。
onStop()执行该方法时,Fragment完全不可见。
onDestroyView()销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。通常在ViewPager+Fragment的方式下会调用此方法。
onDestroy()销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。
onDetach()解除与Activity的绑定。在onDestroy方法之后调用。



Fragment生命周期执行流程(注意红色的不是生命周期方法):

说明描述
Fragment创建

setUserVisibleHint()->

onAttach()->

onCreate()->

onCreateView()->

onActivityCreated()->

onStart()->

onResume();

Fragment变为不可见状态(锁屏、回到桌面、被Activity完全覆盖)

onPause()->

onSaveInstanceState()->

onStop();

Fragment变为部分可见状态(打开Dialog样式的Activity)

onPause()->

onSaveInstanceState();

Fragment由不可见变为活动状态

onStart()->

OnResume();

Fragment由部分可见变为活动状态onResume();
Fragment退出应用

onPause()->

onStop()->

onDestroyView()->

onDestroy()->

onDetach()

(注意退出不会调用onSaveInstanceState方法,因为是人为退出,没有必要再保存数据);

Fragment被回收又重新创建

被回收执行

onPause()->

onSaveInstanceState()->

onStop()->

onDestroyView()->

onDestroy()->

onDetach()

Fragment重新创建执行

onAttach()->

onCreate()->

onCreateView()->

onActivityCreated()->

onStart()->

onResume()->

setUserVisibleHint();

横竖屏切换:与Fragment被回收又重新创建一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达帮主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值