Fragment使用总结
16lz
2021-01-24
前段时间在开发中使用到了Fragment,由于不了解,碰到了不少坑,于是系统学习了下相关的文档和代码,在这里做个总结,本文总结至android开发文档中的Fragment的介绍文档(点这里),本文中的代码和图片也都来自这篇文档。
简介
Fragment是一种比activity更小的android ui组件,通过Fragment,我们可以设计出更小粒度的UI模块,这样,我们的UI界面的开发可以更加灵活,更加具有复用性。Fragment与Activity很像,它也有自己的生命周期和对应的生命周期函数,看起来,Google设计Fragment可以是为了解决activity较重,不太利于复用的问题。Fragment必须嵌入到activity中才能使用,因此Fragment的生命周期会受到Activity的影响,例如当一个Activity pause时,这个Activity内部所有的Fragment都会处于Pause状态,同样一个Activity destroy时,其内部所有的Fragment都会destroy。
设计理念
在android3.0之后,手机屏幕变得越来越大,android平板也逐渐流行,这导致单个activity中包含的内容越来越多,维护和复用都变得困难重重。为了解决这个问题,android引入了Fragment,通过使用fragment 可以缩小用户对界面的操纵粒度,提升UI的灵活性和复用性。Fragment的使用方法
在android3.0之后,应用可以直接使用fragment和相关的类即可。而3.0之前的应用如果想要使用fragment,需要引入android.support.v4 这个包,并使用这个包中相关的类。使用Fragment需要以下几步:1.定义一个继承类
创建一个类继承Fragment,android3.0及以上可以直接继承android.app.Fragment, android2.3及以下需要导入android.support.v4 这个包,之后再继承android.support.v4.app.Fragment。对于android2.3及以下版本,同时还要确保用来容纳Fragment的Activity必须从android.support.v4.app.FragmentActivity继承下来。2.覆盖三个方法
覆盖的三个方法都是生命周期的回调方法 1. onCreate。当创建Fragment时会调用这个方法,在这个方法中初始化Fragment相关的组件 2. onCreateView。当系统需要绘制这个fragment时,调用这个方法,在这个方法中创建Fragment的View并将根节点return出去。 3. onPause。当用户离开这个Fragment时候调用这个回调。在这个回调中将所有需要保存的保存好。3.将Fragment添加到activity中
Fragment需要依附于activity才能运行,因此我们需要将Fragment添加到activity中,有两种添加的方法。 1.直接在activity的layout中声明。 [html] view plaincopy- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <fragment android:name="com.example.news.ArticleListFragment"
- android:id="@+id/list"
- android:layout_weight="1"
- android:layout_width="0dp"
- android:layout_height="match_parent" />
- <fragment android:name="com.example.news.ArticleReaderFragment"
- android:id="@+id/viewer"
- android:layout_weight="2"
- android:layout_width="0dp"
- android:layout_height="match_parent" />
- LinearLayout>
- FragmentManager fragmentManager = getFragmentManager()
- FragmentManager fragmentManager = getSupportFragmentManager()
- FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
- ExampleFragment fragment = new ExampleFragment();
- fragmentTransaction.add(R.id.fragment_container, fragment);
- fragmentTransaction.commit();
Fragment的生命周期
1.Fragment生命周期,如图所示。
2.Fragment生命周期的回调函数
onAttach:当Fragment第一次Attach到Activity时调用。生命周期中的第一个回调 onCreate:初次创建Fragment时候调用 onCreateView:创建Fragment UI的时候调用,对于有View的Fragment,在这个函数里,需要返回一个View对象(Fragment view的root) onActivityCreated:当Fragment依附的activity和Fragment的View创建完成后调用。这是最后一个初始化的回调,在这个函数中调用可以做一些数据恢复的动作(从task列表恢复的情况) onStart:当Fragment对用户可见时调用 onResume:当Fragment对用户可见并且处于Active状态时调用 onPause:当Fragment被deactive的时候调用 onStop:当Fragment对用户不可见的时候调用 PS:以上四个生命周期函数一般都又Activity的生命周期函数所触发。 onDestroyView:当Fragment的View被从layout中移除时调用。 onDestroy:当Fragment不再被使用时调用。 onDeattch:当Fragment不再attach到activity时候调用。最后一个回调函数。管理Fragment
1.FragmentManager
FragmentManager提供了管理Fragment的功能包括- 通过Tag/ID查找Fragment。findFragmentByTag()和findFragmentById()。
- 维护一个Fragment的back stack,通过这个back stack可以模拟类似activity的back行为
- back stack的监听接口addOnBackStackChangedListener
2.FragmentTransaction
使用FragmentTransaction来对Fragment进行操作,我们可以通过FragmentManager的接口来得到一个FragmentTransaction对象。FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentTransaction支持的操作有add(), remove(), replace()等,我们可以使用FragmentTransacation执行一系列的操作,最后调用commit让这些操作生效。FragmentManager会为FragmentTransaction维护一个back stack,可以调用FragmentTransaction的addToBackStack方法来将这个Transaction中得操作加入到back stack,已经加入到back stack的Transaction将来可以被回滚。commit函数调用后,操作并不会立即commit,如果想要立即commit,可以调用FragmentMan的executePendingTransactions方法。注意,如果当前activity不是处于active状态,那么调用commit会导致一个exception,因为这个状态下,fragment的状态会丢失掉,原因可能因为activity中所有fragment的状态会在activity的onSaveInstanceState中保存,一旦activity已经inactive那么onSaveInstanceState很有可能已经被调用过了,那个这个时候在去修改fragment的状态,当然无法得到保存。使用commitAllowingStateLoss 可以显示告诉系统,我们不在意状态丢失,这样系统就不会抛出这个异常了。 detach和remove的区别。这里的detach和Fragment生命周期中的onDetach方法并不是对应的。使用detach,这个Fragment只会调用onDestroyView,而不会onDestroy,因此这样,我们可以在使用attach将它再次加入到layout中(view会重新创建)。而使用remove则要看FragmentTransaction是否被添加到了back stack中,如果没有添加,则Fragment会直接被destroy。
更多相关文章
- android 模拟器创建的sdcard 没有mount
- ADB适用方法
- android艺术开发探索之RemoteViews跨进程更新UI
- Android(安卓)Sensor HAL层初始化流程(基于Qualcomm平台)
- Android中多线程的handler与Thread
- android 事件机制,捕捉与事件监听总结整理(二)Event Handlers,Handli
- app launcher 名称不是清单文件中的android:label
- android 拦截机制的分析
- android 数据传递详解(Serialization、Parcelable、Parcel、Inten