Android学习笔记031之Fragment

来源:互联网 发布:马克斯cms模板防盗 编辑:程序博客网 时间:2024/05/18 20:33

  上一篇博客介绍了RecyclerView实现拖拽和滑动删除效果,里面用到了Fragment,这一篇中,我们就学习一下Fragment。在这篇博客中,我们将会介绍Fragment的基础概念,Fragment的生成方式、Fragment的事物、Fragment与Activity交互、Fragment回退栈、还有其它使用等。下面我们开始学习Fragment吧!

1、Fragment的基本概念

1.1、什么是Fragment?

  Fragment是Android3.0之后推出的一个新的API,一开始是为了平板电脑开发而推出的,现在很多平板电脑的UI开发仍在使用,但是很多手机APP设计都在使用这个API。Fragment是Activity的一部分,这样我们在一个界面有很多UI控件的时候可以分割开来在Fragment中使用,不必要在Activity里面写一大堆的事件处理。Fragment拥有自己的生命周期和接收、处理用户的事件,我们还可以动态的添加、替换和移除Fragment。

1.2、Fragment的生命周期

  虽然Fragment有自己的生命周期方法,但是Fragment必须挂载在Activity才可以使用,不能单独使用,它的生命周期受到Activity生命周期方法的约束,当Activity销毁的时候Fragment也会销毁,下面我们看一下官方的生命周期图:

可以看到Activity和Fragment有同样的生命周期方法,但是Fragment的生命周期方法比Activity多了几个:

  • onAttach()方法:当Fragment挂载到Activity的时候调用,只会调用一次

  • onCreate()方法:当Fragment创建的时候回调,只会调用一次

  • onCreateView()方法:当Fragment绘制View的时候调用,返回绘制的View对象,当Fragment新建或者从从回退栈返回界面的时候都会调用

  • onActivityCreated()方法:当Fragment挂载到的Activity启动完成的时候调用

  • onStart()方法:启动Fragment的时候调用

  • onResume()方法:但Fragment恢复的时候调用,onStart()方法被回调的时候onResume()一定会被回调

  • onPause()方法:当Fragment暂停的时候会被回调

  • onStop()方法:当Fragment停止的时候会被回调

  • onDestroyView()方法:当销毁Fragment中包含的所有View组件的时候调用

  • onDestroy()方法:当Fragment被销毁的时候的回调

  • onDetach()方法:当Fragment从Activity中被移除或者替换的时候的回调,onDestroy()方法之后一定调用,只调用一次

      上面的就是Fragment的生命周期方法,有一些方法与Activity一样,但是也有自己的一些生命周期方法。官方介绍里面,使用Fragment必须要实现三个方法:onCreate、onCreateView、onPause,不过貌似只实现onCreateView也可以使用。

1.3、Fragment注意事项

  Fragment是Android3.0之后推出的,Android为更低的版本提供了兼容,就是使用V4包中的Fragment,不过要注意的是,如果是使用V4包中的Fragment,那么FragmentManager和FragmentTransaction都必须使用V4包中,不然会报错。如果不需要兼容3.0以下版本的,可以使用APP包中的。

2、创建Fragment

  Fragment创建有两种方式,分别是:静态创建Fragment和动态创建Fragment,下面分别介绍一下:

2.1、静态创建Fragment(不推荐)

  静态创建Fragment就是在XML资源文件中创建,静态创建Fragment的步骤如下:

1)、自定义一个Fragment类,继承于Fragment,实现onCreateView方法,并加载一个布局文件

@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_static, container, false);return view;}

2)、在Activity的布局文件中使用Fragment属性,并且android:name需要时是你加载的Fragment的全路径类名,还有必须设置Id属性,不然会报错

<LinearLayout    android:layout_width="match_parent"    android:layout_height="0dp"    android:layout_weight="1">    <fragment        android:id="@+id/fragment_static"        android:name="com.example.fragmentdemo.StaticFragment"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>

3)、在Activity中加载布局文件

setContentView(R.layout.activity_fragment);

这样就可以完成静态Fragment的创建。

2.2、动态创建Fragment

动态创建Fragment的流程:

1)、自定义一个Fragment,继承于Fragment,写一个Fragment的布局文件,并在Fragment中实现onCreateView,加载View

2)、使用V4包的就在Activity中通过getSupportFragmentManager()获得FragmentManager对象,如果是app包中的就通过getFragmentManager()方法获取FragmentManager对象。

3)、用上一步中获取到的FragmentManager对象,调用beginTransaction()方法开启FragmentTransaction事物,开启事物的时候可以顺便调用commit()方法(commit()方法是必须要调用的,以防忘记,可以在开启事物的时候就调用)

4)、用获得的FragmentTransaction对象通过replace或者add方法加载Fragment。

private AutoFragment fragment;private FragmentManager manager;private FragmentTransaction transaction;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_fragment);    fragment = new AutoFragment();    manager = getSupportFragmentManager();    transaction = manager.beginTransaction();    transaction.replace(R.id.fl_auto_content, fragment);    transaction.commit();}

这样就可以动态加载Fragment。主要操作的是FragmentTransaction里面的方法,FragmentTransaction里面的方法有:

  • transaction.add()方法:往Activity中添加一个Fragment

  • transaction.remove()方法:从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁。

  • transaction.replace()方法:使用另一个Fragment替换当前的,实际上就是remove()然后add()的结合使用

  • transaction.hide()方法:隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

  • transaction.show()方法:显示之前隐藏的Fragment

  • detach()方法:会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

  • attach()方法:重建view视图,附加到UI上并显示。

  • transatcion.commit()方法:提交一个事务,这个方法开启一个事物就必须要调用

上面这些就是常用的FragmentTransaction的方法。

3、Fragment与Activity的交互

  前面我们介绍了一些Fragment的基础,我们知道Fragment必须挂载到Activity中才可以使用,那么现在,我们来学习一下Fragment和Activity的交互。

  • Activity包含Fragment,所以Activity可以通过引用Fragment直接访问Fragment中Public修饰的方法;

  • 如果Activity中没有保存有Fragment的引用,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行相应的操作;

  • 在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作;

  • Activity传递数据给Fragment:在Activity中创建Bundle对象,调用Fragment实例的setArguments(bundle)方法将Bundle对象里面封装的数据传递给Fragment,然后Fragment调用getArguments()方法获得Bundle对象,解析数据即可

  • Fragment传递数据给Activity:在Fragment中创建一个回调接口,在与当前Fragment绑定的Activity中实现这个回调接口,在回调接口中传递数据,在这里就不写代码了,在网上很多回调接口的设计。

  • Fragment之间的数据传递:如果是需要从AFragment跳转到BFragment的,直接在AFragment中获取到BFragment实例,然后初始化跳转的时候通过setArguments(Bundle)方法将数据传递过去即可;如果不是需要跳转的,就需要一个Activity当中介传递,具体就是AFragment将数据传递到Activity,然后Activity再将数据传递给BFragment。

关于Fragment就简单介绍到这里,这里是非常简单的介绍,我们可以用Fragment实现很多的效果,如新闻界面,微信界面等,关于Fragment推荐鸿洋大神的两篇博客,分别是:Android Fragment 真正的完全解析(上)和 Android Fragment 真正的完全解析(下)
下面我们会学习Android的数据存储。

最后附上Fragment的国内镜像API这个是app包下的,v4包下的是

1 0
原创粉丝点击