Android学习——碎片(fragment)
碎片
- 1.碎片是什么
- 2.碎片的使用方式
- 2.1静态加载Fragment
- 2.2动态添加碎片
- 2.3在碎片中返回栈
- 2.4Fragment管理与Frangment事务
- 2.5Fragment与Activity的交互
- 3.碎片的生命周期
- 3.1 碎片的状态
- 3.2生命周期的流程
- 3.3常用操作下生命周期流程
1.碎片是什么
Fragment是Android3.0后引入的一个新的API,它出现的初衷是为了适应大屏幕的平板电脑, 当然现在它仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!
下面这张图就是一个fragment分别对应手机与平板的处理图
2.碎片的使用方式
2.1静态加载Fragment
第一步:
定义一个Fragment的xml文件
我定义的是left_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:id="@+id/button"android:text="Button"/></LinearLayout>
第二步:
自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法
在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象
- 在继承Fragment时,会有两个不同包下的Fragment供我们选择(如下图)
一个是AndroidX库中的androidx.fragment.app.Fragment ,一个是系统内置的android.app.Fragment ,这里我们选择AndroidX库中的Fragment ,因为它可以让Fragment的特性在所有Android系统版本中保持一致,而系统内置的Fragment在Android 9.0版本中已被废弃。
//这里的名字就叫LeftFragment
public class LeftFragment extends Fragment {@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {View view=inflater.inflate(R.layout.left_fragment,container,false);return view;}
}
第三步:
在需要加载Fragment的Activity对应的布局文件中添加fragment的标签, 记住,name属性是全限定类名哦,就是要包含Fragment的包名,
<fragmentandroid:id="@+id/left_fragment"android:name="com.example.fragmenttest.LeftFragment"android:layout_width="match_parent"android:layout_height="match_parent"/>
第四步:
Activity在onCreate( )方法中调用setContentView()加载布局文件即可!
2.2动态添加碎片
实现流程
2.3在碎片中返回栈
我们成功实现了向活动中动态添加碎片的功能,不过你尝试一下就会发现,通过点击按钮添加了一个碎片之后,这时按下Back键程序就会直接退出。如果这里我们想模仿类似于返回栈的效果,按下Back键可以回到上一个碎片,该如何实现呢?
其实很简单,FragmentTransaction中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中,修改MainActivity中的代码,如下所示.
private void replaceFragment(Fragment fragment) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.fragment, fragment);transaction.addToBackStack(null);transaction.commit();}
2.4Fragment管理与Frangment事务
2.5Fragment与Activity的交互
- 组件获取
Fragment获得Activity中的组件: getActivity().findViewById(R.id.list);
Activity获得Fragment中的组件(根据id和tag都可以):getFragmentManager.findFragmentByid(R.id.fragment1);
数据传递
①Activity 传递数据给Fragment:在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle) 从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得 Bundle对象,进行解析就可以了
②Fragment传递数据给Activity
1.在Fragment定义一个接口,接口中定义抽象方法,你要传什么类型的数据参数就设置为什么类型;
2.接着写一个调用接口中的抽象方法,把要传递的数据传过去
3.再接着就是Activity了,调用Fragment提供的那个方法,然后重写抽象方法的时候进行数据 的读取就可以了!!!③Fragment与Fragment之间的数据互传
找到要接受数据的fragment对象,直接调用setArguments传数据进去就可以了
通常的话是replace时,即fragment跳转的时候传数据的,那么只需要在初始化要跳转的Fragment 后调用他的setArguments方法传入数据即可!
如果是两个Fragment需要即时传数据,而非跳转的话,就需要先在Activity获得f1传过来的数据, 再传到f2了,就是以Activity为媒介
3.碎片的生命周期
3.1 碎片的状态
- 运行状态
当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。 - 暂停状态
当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态。 - 停止状态
当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过调用FragmentTransaction的 remove()、replace()方法将碎片从活动中移除,但如果在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。 - 销毁状态
碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用FragmentTransaction的remove()、replace()方法将碎片从活动中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的碎片也会进入到销毁状态。
活动中有的回调方法,碎片中几乎都有,不过碎片还提供了一些附加的回调方法,那我们就重点看一下这几个回调:
- onAttach()。当碎片和活动建立关联的时候调用。
- onCreateView()。为碎片创建视图(加载布局)时调用。
- onActivityCreated()。确保与碎片相关联的活动一定已经创建完毕的时候调用。
- onDestroyView()。当与碎片关联的视图被移除的时候调用。
3.2生命周期的流程
3.3常用操作下生命周期流程
①Activity加载Fragment的时候,依次调用下面的方法: onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart ->onResume
②当我们弄出一个悬浮的对话框风格的Activity,或者其他,就是让Fragment所在的Activity可见,但不获得焦点 onPause
③当对话框关闭,Activity又获得了焦点: onResume
④当我们替换Fragment,并调用addToBackStack()将他添加到Back栈中 onPause -> onStop -> onDestoryView !!注意,此时的Fragment还没有被销毁哦!!!
⑤当我们按下键盘的回退键,Fragment会再次显示出来: onCreateView -> onActivityCreated -> onStart -> onResume
⑥如果我们替换后,在事务commit之前没有调用addToBackStack()方法将 Fragment添加到back栈中的话;又或者退出了Activity的话,那么Fragment将会被完全结束, Fragment会进入销毁状态 onPause -> onStop -> onDestoryView -> onDestory -> onDetach
内容参考:《第一行代码》——郭霖
Android学习——碎片(fragment)相关推荐
- Android学习之 Fragment
[eoe特刊]Fragment- 特刊-eoe Fragment应用的介绍 - memegood123的专栏 - 博客频道 - CSDN.NET android之Fragment(官网资料翻译) - ...
- 老式Android中碎片Fragment之间的跳转和数据传递
随着jetpack组件的使用,fragment之间的跳转和传值已经有相应的demo了.但是有时候难免不用Navigation,或者一些老项目的维护.这里,简单记录下老式fragment怎么跳转和传值. ...
- android学习笔记Fragment的使用
Fragment的内容感觉好多啊,主要需要掌握Fragment静态加载,Fragment动态加载,Fragment的生命周期,Fragment与Activity的交互 1,Fragment的静态加载 ...
- Android学习之碎片的生命周期
一.碎片的状态: 1.运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态. 2.暂停状态:当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它 ...
- Android学习之碎片与活动之间的通信
一.碎片虽然是嵌入在活动中显示的,但是碎片和活动都是各自存在不同的类当中的,并没有什么明显的方式来直接进行通信的.那么如果要在活动中调用碎片里的方法,在碎片里调用活动的方法,一个碎片调用另一碎片的方法 ...
- Android学习之动态调用碎片
一.碎片可以在程序运行时动态添加到活动当中.我们可以根据具体情况动态地添加碎片,使得界面定制更加多样化,下面将用个例子来介绍动态调用碎片. 先附上下面例子运行后的效果,效果如下: 点击左边按钮后动态改 ...
- Android学习之简单地使用碎片
一.碎片(Fragment)是一种可以嵌入在活动当中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛,所以,首先我们必须新建一个4.2以上系统的平板电脑的模拟器, ...
- android studio 碎片,Android studio之碎片学习
碎片是什么? 碎片( Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛.虽然碎片对你来说应该是个全新的概念,但我相信你学习起 ...
- android碎片按钮,Android 碎片(Fragment)
Android 碎片(Fragment) 碎片是活动的一部分,使得活动更加的模块化设计.我们可以认为碎片是一种子活动. 下面是关于碎片的重要知识点 - 碎片拥有自己的布局,自己的行为及自己的生命周期回 ...
最新文章
- 微软修复Windows 10周年更新KB3194496累积更新安装问题
- linux下tomcat的安装和配置
- 寄存器讲解--汇编(32位处理器)
- Codeforces Round #650 (Div. 3)(A-C)
- java比较炫的小程序_推荐三款私藏多年的微信小程序
- Python 炫技操作:条件语句的七种写法,你都知道吗?
- 基于JAVA+SpringMVC+Mybatis+MYSQL的网上拍卖秒杀竞价系统
- 加盟商最大的顾虑是什么?
- CV2/PIL/Matplotlib读取图片注意事项
- python三维网格图_python-3D网格之间的Hausdorff距离
- python精彩编程200例-200G的Python初高级教程+项目实战案例源码,让你做有钱途的人才...
- 无权有向图的最短路径
- 转载:如何开发高性能低成本的网站之技术选择
- 深入了解JavaScript目录(持续更新)
- 100并发 - 千万并发,阿里淘宝的 14 次架构演进之路
- 魔兽世界国服服务器稳定,《魔兽世界》国服大服务器功能实装启动
- 电驴链接服务器老是无响应,全部服务器无响应!!!
- Ubuntu和本机之间复制粘贴
- 【推荐系统】User-Item CF:GC-MC
- matlab如何计算矩阵的幂,MATLAB矩阵幂算法