Fragment (碎片)
“碎片”---Sub Activity
Fragment是Android 3.0 (Honeycomb)被引入的。主要目的是为了给大屏幕(如平板电脑)上更加动态和灵活的UI设计提供支持。由于平板电脑的屏幕比手机的屏幕大很多,因此可用于组合和交换的UI组件的空间更大,利用Fragment实现此类设计的时,就无需管理对视图层次结构的复杂更改。
通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。如果仅仅只有Activity布局,那是不够的,不仅在手机上有一套布局,同时在平板上还需要设计一套布局,那样维护起来也麻烦,代码上也有一定的冗余,对于APP包的大小也有一定的压力。Fragment的优势是布局在不同设备上的适配。
Fragment是什么:
简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。
静态添加
在界面的xml中,写控件视图fragment,在另写一个xml(就行listview似的),写一个类去去继承Fragment, 返回值就是解析视图(就是另一个视图),在fragment里得去写class或者name这个的目的是绑定继承Fragment这个类。
动态添加
在界面的xml中,写控件视图FrameLayout帧布局,写两个分别给权重
在写两个类去继承Fragment 包是app,返回值都分别是解析所用的视图
在主java文件中
//FragmentManger:Activity内部用来与Fragment进行交互的接口
FragmentManager fragmentManager = getFragmentManager();
//开启一个事物
FragmentTransaction transaction = fragmentManager.beginTransaction();
left left = new left();
//将左侧的那个Fragment添加到R.layout.left这个id所代表的容器中。
transaction.add(R.id.left,left);
right right = new right();
transaction.add(R.id.right,right);
transaction.commit();
动态创建Fragment(掌握)
通过动态加载的方式来加载Framgnt,咱们在使用之前,先来看看下面的内容:
Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~
a、获取FragmentManage的方式:
getFragmentManager() // v4中,getSupportFragmentManager
b、主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
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()//提交一个事务
Activity与Fragment之间通信(掌握)
Android 为Fragment 和Activity之间的通信提供了两种机制:
机制1:
①Fragment获取它所在的Activity
调用Fragment的getActivity()方法即可返回它所在的Activity实例,之后我们就能够通过这个实例调用
findViewById(int) 方法了,也就是说,我们能够在Fragment中得到相关联的Activity的组件的信息 ,
如:TextView textView = (TextView)getActivity().findViewById(R.id.textView) ;
之后就能够获得TextView中的字符内容
机制2:
①Activity向Fragment中传递数据
在Activity中创建Bundle数据包,并调用Fragment对象的setArguments(Bundle bundle)方法
(也就是说我们得要首先创建一个Fragment对象之后才能够用这个对象调用setArgument(Bundle)方法)即
可将Bundle数据包传递给该Fragment对象;之后在Fragment类中调用getArguments()方法就能够获得这个
Bundle包.这个方法一般用在Activity加载一个Fragment的时候,由于当我们加载一个Fragment的时候就想
要将一些数据传给Fragment对象,来对Fragment对象进行初始化,所以在Fragment中的onCreate()或者
onCreateView()方法中调用getArgument()方法来获得这个Bundle对象
②Fragment实时的向Activity通信
实际就是使用接口回调的机制,也就是在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity
类实现这个接口,这样Fragment就能够调用这个回调方法,将数据传给Activity中
Fragment的生命周期
onAttach 附加,绑定
onCreate 创建
onCreateView 创建视图
onActivityCreated
onStart 开始
onResume 获取焦点
Onpause 失去焦点
onStop 暂定
onDestroyView 销毁是u
onDestroy 销毁
onDetach 分离
Fragment的生命周期的执行顺序
创建:
Activity-onCreate
Fragment-onAttach
Fragment-onCreate
Fragment-onCreateView
Fragment-onActivityCreated
Activity-onStart
Fragment-onStart
Activity-onResume
Fragment-onResume
点击返回键:
Fragment-onPause
Activity-onPause
Fragment-onStop
Activity-onStop
Fragment-onDestroyView
Fragment-onDestroy
Fragment-Detach
Activity-onDestroy
Activity 生 Fragment 生
Fragment死 Activity 再死