《第一行代码》系列读书笔记
Fragment简介
Fragment生命周期
Fragment的使用方式
Fragment与Activity之间进行通信
1.Fragment简介
-
碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛。
学习Fragment的时候可以联系之前学习过的Activity,因为它们有很多相似点:都可包含布局,有自己的生命周期,Fragment可看似迷你活动,它可作为Activity界面的组成部分,可在Activity运行中实现动态地加入、移除和交换。一个Activity中可同时出现多个Fragment,一个Fragment也可在多个Activity中使用。
2.Fragment生命周期
-
onAttach():当Fragment和Activity建立关联时调用
onCreateView():当Fragment创建视图时调用
onActivityCreated():当与Fragment相关联的Activity完成onCreate()之后调用
onDestroyView():在Fragment中的布局被移除时调用
onDetach():当Fragment和Activity解除关联时调用Activity的FragmentManager负责调用队列中Fragment的生命周期方法,只要Fragment的状态与Activity的状态保持了同步,托管Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致。
Fragment生命周期与Activity生命周期的一个关键区别就在于,Fragment的生命周期方法是由托管Activity而不是操作系统调用的。Activity中生命周期方法都是protected,而Fragment都是public。
3.Fragment的使用方式
-
(1)静态加载:
第一步:新建.xml,为Fragment指定一个布局。
第二步:新建一个Fragment类并继承Fragment,然后重写onCreateView()方法,这个方法里通过LayoutInflater的inflate()方法将刚刚定义的布局加载进来并得到一个View,再return这个View。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.another_right_fragment, container, false); return view; }
第三步:新建.xml,作为Activity的布局,使用<
fragment>标签添加碎片,并且一定要有android:name属性且值为被加载的Fragment类的包名.类名完整形式。<fragment android:id="@+id/left_fragment" android:name="com.example.fragmenttest.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" />
第四步:在MainActivity中加载main布局。现在MyFragment就完成了静态加载到MainActivity中,这时碎片里的控件自然也是活动的一个部分。
-
(2)动态加载
第一步,创建待添加的碎片实例。第二步,先用getFragmentManager()方法获取一个FragmentManager对象。
第三步,开启一个事务,通过beginTransaction()获取一个FragmentTransaction的实例。
第四步,向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。
第五步:提交事务,调用beginTransaction.commit()提交。
private void replaceFragment(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.right_layout, fragment); transaction.addToBackStack(null);//模拟返回栈 transaction.commit(); }
-
限定符(Qualifiers)
最小宽度限定符允许我们对屏幕的宽度制定一个最小值(以dp为单位),然后以这个最小值为临界点,屏幕大于这个值就加载一个布局,小于这个值就加载另一个布局。
4.Fragment与Activity之间进行通信
-
在活动中可以通过调用FragmentManager的findFragmentById()方法来得到相应碎片的实例,继而可以调用碎片里的方法。
如果想得到静态加载碎片的实例,可使用getFragmentManager(). findFragmentById();
如果想得到动态加载碎片的实例,代码如下:
fragmentManager(). findFragmentById();
在碎片中也可以通过调用getActivity()方法来得到和当前碎片相关联的活动实例,进而调用活动里的方法
MainActivity activity=(MainActivity)getActivity();
于是碎片和活动可以很方便地进行通信了。再想一想碎片和碎片之间如何进行通信?先在一个碎片中可以得到与它相关联的活动,然后再通过这个活动去获取另外一个碎片的实例,这样实现了不同碎片之间的通信了。