阅读郭林《第一行代码》的笔记——第4章 手机平板要兼顾,探究碎片

来源:互联网 发布:mac子弹头色号 编辑:程序博客网 时间:2024/05/05 22:30

1、碎片是什么,碎片的使用方式碎片是什么

碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛。虽然碎片对你来说应该是个全新的概念,但我相信你学习起来应该毫不费力,因为它和活动实在是太像了,同样都能包含布局,同样都有自己的生命周期。你甚至可以将碎片理解成一个迷你型的活动,虽然这个迷你型的活动有可能和普通的活动是一样大的。

动态添加碎片

碎片真正的强大之处在于,它可以在程序运行时动态地添加到活动当中。根据具体情况来动态地添加碎片,你就可以将程序界面定制得更加多样化。
动态添加碎片主要分为5步。
1.创建待添加的碎片实例。
2.获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。
3.开启一个事务,通过调用beginTransaction()方法开启。
4.向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。
提交事务,调用commit()方法来完成。
例子:

   AnotherRightFragment fragment = new AnotherRightFragment();            FragmentManager fragmentManager = getFragmentManager();            FragmentTransaction transaction = fragmentManager. beginTransaction();            transaction.replace(R.id.right_layout, fragment);            transaction.commit();

在碎片中模拟返回栈

通过点击按钮添加了一个碎片之后,这时按下Back键程序就会直接退出。如果这里我们想模仿类似于返回栈的效果,按下Back键可以回到上一个碎片,该如何实现呢?其实很简单,FragmentTransaction中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中,修改MainActivity中的代码,如下所示:

 AnotherRightFragment fragment = new AnotherRightFragment();            FragmentManager fragmentManager = getFragmentManager();            FragmentTransaction transaction = fragmentManager. beginTransaction();            transaction.replace(R.id.right_layout, fragment);            transaction.addToBackStack(null);//在事务提交之前调用了FragmentTransaction的 addToBackStack()方法,它可以接收一个名字用于描述返回栈的状态,一般传入null即可。            transaction.commit();

碎片和活动之间进行通信

(1)碎片与活动之间的通信:
为了方便碎片和活动之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例,代码如下所示:RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);
调用FragmentManager的findFragmentById()方法,可以在活动中得到相应碎片的实例,然后就能轻松地调用碎片里的方法了。
掌握了如何在活动中调用碎片里的方法,那在碎片中又该怎样调用活动里的方法呢?其实这就更简单了,在每个碎片中都可以通过调用getActivity()方法来得到和当前碎片相关联的活动实例,代码如下所示:MainActivity activity = (MainActivity) getActivity();
有了活动实例之后,在碎片中调用活动里的方法就变得轻而易举了。另外当碎片中需要使用Context对象时,也可以使用getActivity()方法,因为获取到的活动本身就是一个Context对象了。
(2)碎片与碎片之间的通信:
这里写图片描述

2、碎片的生命周期

碎片的状态和回调

每个活动在其生命周期内一共有运行状态、暂停状态、停止状态和销毁状态这四种。类似地,每个碎片在其生命周期内也可能会经历这几种状态,只不过在一些细小的地方会有部分区别。
1.运行状态 : 当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
2.暂停状态 :当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态。
3.停止状态 : 当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态。或者通过调用FragmentTransaction的remove()、replace()方法将碎片从活动中移除,但有在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。
4.销毁状态 : 碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用FragmentTransaction的remove()、replace()方法将碎片从活动中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的碎片也会进入到销毁状态。

Fragment类中也提供了一系列的回调方法,以覆盖碎片生命周期的每个环节。其中,活动中有的回调方法,碎片中几乎都有,不过碎片还提供了一些附加的回调方法,那我们就重点来看下这几个回调。
1.onAttach() :当碎片和活动建立关联的时候调用。
2.onCreateView() :为碎片创建视图(加载布局)时调用。
3.onActivityCreated() :确保与碎片相关联的活动一定已经创建完毕的时候调用。
4.onDestroyView() :当与碎片关联的视图被移除的时候调用。
5.onDetach() :当碎片和活动解除关联的时候调用。
碎片完整的生命周期示意图可参考图4.8,图片源自Android官网。

体验碎片的生命周期

——见书4.3.2节——
另外值得一提的是,在碎片中你也是可以通过onSaveInstanceState()方法来保存数据的,因为进入停止状态的碎片有可能在系统内存不足的时候被回收。保存下来的数据在onCreate()、onCreateView()和onActivityCreated()这三个方法中你都可以重新得到,它们都含有一个Bundle类型的savedInstanceState参数。具体的代码我就不在这里给出了,如果你忘记了该如何编写可以参考2.4.5小节。

3、动态加载布局的技巧

使用限定符

如果你经常使用平板电脑,应该会发现很多的平板应用现在都采用的是双页模式(程序会在左侧的面板上显示一个包含子项的列表,在右侧的面板上显示内容),因为平板电脑的屏幕足够大,完全可以同时显示下两页的内容,但手机的屏幕一次就只能显示一页的内容,因此两个页面需要分开显示。
那么怎样才能在运行时判断程序应该是使用双页模式还是单页模式呢?这就需要借助限定符(Qualifiers)来实现了。
Android中一些常见的限定符可以参考下表。
这里写图片描述

使用最小宽度限定符

最小宽度限定符允许我们对屏幕的宽度指定一个最小指(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就加载另一个布局。
需要注意一点,最小宽度限定符是在Android 3.2版本引入的。

0 0
原创粉丝点击