Fragment应该知道的一切(2)
功能需求:如何使用自适应活动布局定义来创建应用程序,以便根据设备外形因素的差异自动重新排列其用户界面。
解决方案:借助自适应活动布局定义,应用程序只需使用几个设计合理的片段即可支持多种设备,解决设备布局中特定差异。
能力要求:能够实现一个用户界面,该界面使用片段自动适应设备布局的差异,并在涉及的片段中协调用户操作。
在用户界面设计中使用,Fragment为创建更容易适应设备差异的应用程序提供了良好的基础,但必须进一步创建真正灵活的用户界面,以便构成UI的Fragment可以轻松地重新排列,以响应应用程序当前运行的设备的特性。为了实现这一点,必须根据当前设备的特性动态改变各个Fragment的布局,必须确保以这样的方式实现Fragment,即每个Fragment都可以有效地发挥作用,而不影响Activity内其他Fragment的行为或甚至存在的布局的变化。
1、动态加载Fragment布局
创建一个灵活的用户界面要求在一个Activity中Fragment的布局和定位能够根据设备特性的差异而改变。可以在应用程序中包含代码,以响应运行应用程序的设备的形状因素动态安排Fragment,但在大多数情况下,这样做不仅是不必要的,而且也是不可取的。用户界面和应用程序代码之间的依赖关系越深,越难以维护和增强应用程序。尽管用户界面和应用程序代码之间始终存在某种程度的依赖关系,但应当尽量减少这种依赖关系,并尽可能在布局资源中尽可能多地执行与用户界面布局相关的工作。在应用程序与用户界面之间建立灵活性的最简单方法是利用Android资源系统内置的设备适应性。 Android允许我们为应用程序设计不同的布局相关资源,每个资源都针对特定的一组特定设备进行了优化(并与之关联)。在运行时,Android资源系统负责为当前设备自动选择和加载适当的资源。虽然此功能可用于动态修改任何活动的布局,但在与Fragment结合使用时,此功能特别有效。
效果图:
在图中,当手机屏幕为竖屏时,空间较小,显示名人列表在上,详情介绍在下;当手机屏幕为横屏时(或为平板设备等),空间较大,如果仍然显示列表在上详情在下则阅读不方便,应布局为列表与详情水平一致较好。
此时如果在Activity界面中进行代码控制则后期维护代价较高,此时应考虑采用Fragment,实现动态布局的效果。
1.1、布局列表fragment_contacts_list.xml
1.2、布局详情界面fragment_contacts_desc.xml
1.3、布局竖屏activity_contacts.xml
1.4、布局横屏activity_contacts.xml
横屏需要在res文件夹中创建横屏布局资源文件夹layout-land;其次命名与layout文件夹中保持一致;
1.5、创建ContactActivity,加载activity_contacts.xml
1.6、创建ContactsListFragment,并加载fragment_contacts_list.xml
1.7、创建ContactsDescFragment,并加载fragment_contacts_desc.xml
运行程序,进入ContactsActivity,效果如上图。
如果没有Fragment,将不得不在整个布局文件中为Activity添加单选按钮,文本视图和所有内容提供整个布局。 然后不得不维护两个复杂的,几乎完全相同的文件。 使用Fragment,单个Fragment是独立的且不复制的。Fragment以简单的方式修改布局,并简化应用程序的维护。
如果更细致的适应不同尺寸大小的设备,则需要建立不同尺寸的布局文件夹(比如:w600),调试activity_contacts.xml;但逻辑代码却是相同的一套方案,利于后期的修改与维护;如果在设计之初通过代码控制来显示,由于交互与布局的耦合性太多,将会导致维护复杂,难于管理。
Fragment可以预防意外情况,用户界面灵活性的真正测试在于用户界面设计和实现,在遇到意外更改请求时的正确性。精心设计的基于Fragment的用户界面能够创建令人难以置信的动态用户界面,这些用户界面可以在对代码影响最小的情况下发展和变化。