探究碎片

      一般手机屏幕的大小在3英寸到5英寸之间,而平板电脑的大小在7英寸到10英寸之间,屏幕大小差距过大有可能会让同样界面在视觉效果上有较大的差异,比如一些界面在手机上看起来非常美观,但在平板上看起来就可能会有控件被过分拉长,元素之间的空隙过大等情况。

   碎片

      碎片(Fragment)是一种可以嵌入在当前活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板应用上非常广泛。碎片和活动很像,甚至你可以将它理解为一个迷你型的活动,虽然这个活动和普通活动是一样大的。

     假如正在开发一个新闻应用,其中一个界面使用ListView展示了一组新闻的标题,当点击了其中一个标题,就打开另一个界面显示新闻的详细内容。在手机设计中,可以将新闻标题列表放在一个活动中,将新闻的详细内容放在另一个活动中,如下图:

可是如果在平板上也这么设计的话,那么新闻标题将铺满整个平板的屏幕,而新闻的标题一般不会太长,这样将会产生大量的空白区域,如下图:

而更好的设计方案是将新闻标题列表界面和新闻详细内容分别放在两个碎片当中,然后在同一个活动里引入这两个碎片,这样就可以将屏幕空间充分利用起来了,如下图:

碎片的使用方式

      先建立一个左侧碎片布局left_layout.xml,如下图:

然后建立一个右侧碎片的布局,right_layout.xml,如下图:

紧接着新建一个LeftFragment类,继承自Fragment类,代码如下:

再创建RightFragment,代码如下:

接下来就开始修改activity_main.xml中的代码了,如下所示:

这样就完成了两个碎片评分整个活动的布局。

动态加载碎片

      碎片的强大之处在于它可以在活动运行时动态地加载到活动中,根据具体情况动态加载碎片,可以将程序界面定制的更加多样化,新建another_right_fragment.xml,代码如下:

       

然后新建一个AnotherFragment作为另一个右侧碎片,和之前一样。

修改activity_main.xml文件,如下:

      <FrameLayout>这个布局方式没有任何的定位方式,所有的控件都会放在布局的左上角,由于只需要在布局里放入一个碎片,因此十分适合使用Framelayout。随后修改MainActivity,如下:

动态添加碎片的逻辑都放在了点击事件里面了,结合上面的代码,动态加载碎片主要分为5步:

1.创建添加碎片的实例。

2.获取到FragmentManager,得到的方法见代码。

3.开启一个事务,见代码。

4.向容器中添加碎片。一般使用replace()方法实现,参数是需要传入容器的id和带添加的碎片实例。

5.提交事务,调用commit()方法来完成。

这样就完成了在活动中动态添加碎片的功能。

 碎片中模拟返回栈

    上面我们已经实现了向活动中动态添加碎片的功能,但是在点击Back键程序就会直接退出,但是想模仿类似返回栈的效果,点击Back键返回到上一个碎片,其实很简单FragmentTransaction中提供了一个addToBackStack()的方法,可以用于讲一个事务添加到返回栈中去,修改MainActivity中的代码,如下:

碎片和活动之间进行通信

     虽然碎片嵌入在活动之中,但是它们的关系并不那么亲密。碎片放在一个单独的类中,与活动之间并没有那么明显的方式来直接通信。

     为了方便碎片和活动之间进行通信,FragmentManager提供了一个类似与findViewById()的方法,专门用于从布局文件中回去碎片的实例

上面是活动中得到碎片,那么在碎片中得到活动如下:

     

另外,当碎片中需要使用Context对象的时候,也可以使用getActivity()方法,因为获取到的活动本身也是一个Context对象。

碎片的声明周期

1.运行状态

       当一个碎片是可见的,并且它所关联的活动正处于运行状态,那么该碎片处于运行状态。

2.暂停状态

       当一个活动进入了暂停状态,与它相关联的可见碎片就会进入暂停状态。

3.停止状态

       当一个活动进入停止状态时,与它相关联的碎片就会进入停止状态。或者调用了FragmentTransaction的Remove(),replace()方法将碎片从活动中移除,但在事务提交之前调用了addToBackStack()方法,这时碎片也会进入停止状态。总的来说,进入停止状态的碎片对于用户来说是不可见的,有可能被系统回收。

4.销毁状态

       当活动被销毁时,与它关联的碎片就会进入销毁状态。 或者调用了FragmentTransaction的Remove(),replace()方法将碎片从活动中移除,但在事务提交之前没有调用addToBackStack()方法,也会进入销毁状态。

当然,Fragment类中也有回调方法对应相应的声明周期:

1.onAttach()

   在碎片和活动建立关联的时候调用。

2.onCreateView()

   为碎片创建视图(加载布局)时调用。

3.onActivityCreated()

    确保与碎片关联的活动一定创建完毕时调用。

4.onDestoryView()

    当与碎片关联的视图移除的时候调用。

5.onDetach()

   的那个碎片和活动解除关联的时候调用。

    

原文地址:https://www.cnblogs.com/hujingwei/p/5105665.html