APP下载

Android的手机平板碎片的研究

2018-11-02

关键词:宽度代码平板

瞿 苏

(江苏旅游职业学院, 江苏 扬州 225000)

一、碎片的概念

程序在手机和平板都能运行,是开发人员必需实现的技术。同时,界面也能正常地展示,Android 3.0版本以上,引入了碎片(Fragment)的概念,碎片是能够让程序更加合理和充分地利用大屏幕的空间。

二、碎片的使用方式

碎片通常都是在平板开发中使用的,首先要做的就是创建一个平板模拟器,创建完成后启动平板模拟器。

(一)碎片的简单用法

在一个活动当中添加两个碎片,并让这两个碎片平分活动空间。这个布局非常简单,只放置了一个按钮,并让它水平居中显示。左右两侧碎片布局分别为 left-fragment.xml和 right-fragment.xml。可以使用标签在布局中添加碎片,碎片的类名通过android:name属性加上,并加上包名。两个碎片平分了整个活动的布局,在真正的项目中很难有什么实际的作用。

(二)动态添加碎片

设计程序时,分别新建another_left-fragment.xml和another_right-fragment.xml。通过碎片动态地添加活动中,可以将程序界面更加多样。在MainActivity中,向FrameLayout添加内容,以此实现动态添加碎片的功能。代码如图1所示:

图1 动态添加碎片代码

结合replaceFragment()方法中的代码可以看出,动态添加碎片主要分为5步,分别是:创建碎片实例;获取 FragmentManager,调用 getSupportFragment Manager()方法;开启一个事务,调用 beginTransaction()方法;replace()方法,向容器内添加或替换碎片;提交事务,调用 commit()方法。

(三)在碎片中模拟返回栈

FragmentTransaction 中调用 addToBackStack()方法,可以将事务添加到返回栈中。相关代码如图2所示:

图2 添加事务到返回栈

(四)碎片和活动之间进行通信

碎片和活动之间的通信,FragmentManager提供了findFragmentById()的方法,可以从布局文件中获取碎片,代码为:RightFragment rightFragment=(RightFragment) getSupportfragmentManager ().findFragmentById(R.id.right_fragment);

获取碎片后,然后在每个碎片中可以调用getActivity()方法来得到和当前碎片相关联的活动实例,代码为:MainActivity activity= (MainActivity)getActivity ();也可以通过 getActivity ()方法获取Context对象。同样,碎片与碎片之间的通信,可以在碎片中获取与碎片相关联的活动,再通过活动获取另外一个碎片的实例。

(五)碎片的生命周期

碎片和活动一样,也有自己的生命周期,碎片的生命周期,如表1所示。

表1 碎片的生命周期

在使用碎片时,会遇到当系统内存不足时,进入停止状态的碎片,有可能被回收。所以可以通过调用onSaveInstanceState()方法保存数据,保存的数据可以通过3个方法获取,3个方法分别是onCreate().onCreateView()和 onActivityCreated()。

三、动态加载布局的技巧

在程序设计时,在布局文件中通过可以添加碎片和替换碎片,解决了一些问题。但在程序运行时,是否可以通过判断设备的分辨率或设备屏幕的宽度来决定加载哪个布局呢?答案是肯定的!Android中,程序运行时动态加载布局有几个技巧。

(一)使用限定符

平板电脑的屏幕宽度足够大,程序运行时,页面显示都是采用双页模式,包含子项列表显示在左侧面板上,列表所选中子项的内容则显示在右侧列表中。但是当使用手机时,程序运行,有两个页面时,程序运行时,怎么判断是单页模式还是双页模式呢。此时就需要使用限定符(Qualifiers)来完成了。

图3代码是使用限定符的例子,是activity main.xml布局文件代码,该布局文件只有左侧碎片文件并且该左侧碎片文件充满整个父布局文件,即单页模式。

图3 activity-main.xml布局文件代码

图4代码是activiy_main.xml布局文件修改后的代码,activiy_main.xml是 res目录下新建的layout-large文件夹中的布局文件。该布局文件中,包含2个碎片文件,分别是left_fragment和right_fragment,即双页模式。

图4 修改后的activity-main.xml文件代码

图4布局文件是基于图3布局文件的改进,其中large就是一个限定符,大屏幕设备会自动加载layout-large文件夹中的布局(图4布局文件),而小屏幕设备则加载layout文件中的布局(图3布局文件)。接着可以将 MainActivity 中 replaceFragment()方法里的代码注释掉,并在平板模拟器上重新运行程序。再启动一个手机模拟器,并在这个模拟器上重新运行程序,这样就实现了在程序运行时动态加载布局的功能。

(二)使用最小宽度限定符

通过以上表述,large限定符可以判断单页或双页的问题。但是很多学习者会提出这样的问题:其中的large值怎么确定?多大的值呢?有具体的范围吗?不同的设备加载布局时,都可以通过使用最小宽度限定符(Smallest-widthQualifier)来设定屏幕宽度,最小宽度限定符指地是屏幕宽度的最小值(单位dp),是设备是否加载布局的临界点,当屏幕宽度大于临界点时,就加载一个布局;当屏幕宽度小于临界点时,就加载另一个布局。比如最小宽度限定符为600dp时,当程序运行时,如果设备屏幕宽度大于600dp时,程序会自动加载新建的布局;如果设备屏幕宽度小于600dp时,程序仍然加载原来默认的布局。

四、碎片实践应用

使用碎片的最典型实例是新闻应用,新闻英语等等,设计的目的就是要求同时兼容手机和平板电脑。

对于新闻应用程序,目录结构如图5所示。

图5 新闻应用程序目录结构

首先新建类News,新建作为新闻内容的布局文件news_content_fr-ag.xml,并创建继承自Fragment的NewsContent-Fragment类。

新闻应用程序设计中,layout-sw600dp文件夹下,创建activity.xml布局文件,该布局文件中,引入了两个碎片,值得一提地是,activity.xml布局文件的id是news_content_layout。程序运行时,如果找到id,则是双页模式;找不到id,则是单页模式。接着在NewsTitleFragment中新建RecyclerView内部类NewsAdapter的适配器。其中,判断单双页模式的代码如下图6所示。

图6 判断单双反模式的代码

RecyclerView内部类可以是直接访问NewsTitleFragment,比如 isTwoPane,以此判断单页模式还是双页模式。最后再在RecyclerView中填充数据,以便双页模式时,右侧新闻内容里的碎片数据。

五、总结

本文主要介绍了碎片的基本概念以及使用场景,碎片的常见用法、碎片生命周期的相关内容以及动态加载布局的技巧,以及碎片的实践应用。

猜你喜欢

宽度代码平板
属于你的平板电脑
出彩的立体声及丰富的画面层次 华为|平板M6
创世代码
创世代码
创世代码
创世代码
10%平板电脑市场销量下滑
孩子成长中,对宽度的追求更重要
The Apple of Temptation
你有“马屁股的宽度”吗?