android弹出fragment
① Android入门教程 | DialogFragment 的使用
DialogFragment的使用教程如下:
DialogFragment简介:
- DialogFragment是Android 3.0版本引入的特殊Fragment,用于在Activity上展示模态对话框。
- 弹窗作为常见提示方式,在Android开发中扮演重要角色,DialogFragment提供了一种更灵活和强大的方式来创建和管理弹窗。
创建DialogFragment:
- 新建一个类,继承自DialogFragment。
- 在这个类中,可以重写onCreateDialog或onCreateView方法来定义弹窗的UI和内容。
- onCreateDialog方法适用于简单的对话框,可以直接通过AlertDialog.Builder来构建。
- onCreateView方法则适用于需要更复杂布局的对话框,可以通过加载布局文件来实现。
展示DialogFragment:
- 调用DialogFragment的show方法,传入FragmentManager和可选的tag,即可展示弹窗。
- FragmentManager用于管理Fragment的事务,包括添加、移除、替换等。
- tag是一个可选的字符串,用于标识这个DialogFragment,方便后续的操作,如移除或查找。
运行代码查看效果:
- 编写完DialogFragment的代码后,运行应用程序,查看弹窗的效果是否符合预期。
- 根据实际效果,调整布局文件或DialogFragment的代码,以达到满意的弹窗效果。
学习资源推荐:
- 对于初学者来说,推荐学习Android零基础入门到精通的完整教程,这些教程包含了Android Studio安装、全套Android基础教程、java语言基础、Kotlin语言基础等必要知识。
- 观看安装教程视频,按照步骤操作,可以顺利安装Android Studio。
- 通过视频学习Android开发基础,图书可以用于查漏补缺和深入学习。
- 掌握Android开发基础后,可以进一步学习四大组件使用、创建Service、布局设计、自定义View、动画、网络通信等技术。
通过以上步骤,你可以掌握DialogFragment的基本使用方法,并在Android应用程序中创建出美观且功能强大的弹窗。
② Android组件之Fragment(一)---基础知识与运用
Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!
引用官方的一张图片,其实已经说明问题了,就是为了更好的适配大屏,在大屏的时候,不需要去在一个activity内部通过复杂的布局和界面去实现,只需要去在一个activity内部,通过多个fragment来做界面布局实现即可,而且针对于多个fragment来说, 每个fragment有单独的生命周期,
Demo样例,我们在一个界面中,有上下两个fragment,如图所示:
Step 2: Fragment创建,视图加载,数据赋值
BlankFragment .java
Step 3: Activity在onCreate( )方法中调用setContentView()之后调用FragmentTransaction 进行事务提交
FragmentTestActivity.java
在xml中声明两个fragment,指定为具体的fragment
Step 1:定义Fragment的布局,就是fragment显示内容的
Step 2:自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象
BlankFragment.java
Step 3:在需要加载Fragment的Activity对应的布局文件中添加fragment的标签, 记住,name属性是全限定类名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中调用setContentView()加载布局文件即可!
针对在一个Activity中的某个Layout中切换Fragment,,无非两种方法:
我们自己看一下方法注释
源码方法注释里面说的很明白,这个方法会移除所有的fragment,然后添加当前的fragment。
这时分为两种情况,一种是fragment已有并且在前台展示,一种是未有或者在后台,针对于前者,此时replace,生命周期不会发生变化,针对后者,生命周期会重新走
分为两种情况,一种fragment已存在,一种未存在,针对于前者,生命周期无变化,但是会回调onHiddenChanged方法,针对于后者,生命周期会创建一次。
1.Fragment是Google官方引入的一个为了适配大屏、多页面的一个组件。您可以理解为它就是一个类而已,只不过里面包含了View,并且与activity的生命周期进行了关联。
2.动态加载与静态加载相对来说,建议使用动态加载,静态加载固定在了xml文件中,永远不变。
3.replace的fragment如果不在前台,会执行所有生命周期,反之不会执行任何生命周期方法;hide+show生命周期并不会发生变化,但是会回调onHiddenChanged方法,在实际开发中,建议add之后,使用hide+show来操作fragment,一方面减少资源的重复加载和创建,另外一方面提升用户体验感。
4.fragment的生命周期大体上和activity一致,但是前期和后期多了一些东西,因为fragment内部有view,那么这个view需要进行创建、然后添加到activity内部,所以相应的在onCreate与onStart之间就多了几个方法-onCreateView、onViewCreated。相同的道理,fragment的view与activity解绑,也相应的在onStop与onDestory之间多个方法-onDestroyView。onAttach与onDetach可以理解为视图与activity产生关联和接触关联,是最开始和最后的步骤。
Demo地址
③ Android屏幕变化引起Fragment折叠的解决办法
奇葩问题年年有,今天又碰到一个,最近呢,在项目开发维护中遇到这样一个bug,vivo某某型号手机,三指头同时下滑,瞅瞅效果图,屏幕露出半个桌面来,而我们的应用布局发生重叠,不得不佩服我们的测试小姐姐,这样奇葩问题,你都找得到,怎么办呢,网络谷歌呗!
这样子,在当前页面的Activity中的onCreate方法中输出日志,当页面首次打开的时候有日志输出,当三个手指下滑的时候,又有日志输出,ok,到这里问题已经明朗,Activity重新创建了,显然因为生命周期方法重复执行导致它承载的Fragment出现了布局折叠问题。
当手机屏幕变化笑银培,比如横竖屏切换,布局变化,屏幕尺寸改变等,在不经过设搏仿置时activity会被重新启动创建,而且还不止一次,而要防止这碰唯个现象的发生,就需要配置configChanges这个属性了。
找到了原因,那么开始实施解决方案。
在AndroidManifest.xml中配置configChanges这个属性如下
当配置完成后,再次发布程序到手机,日志不在重复打印,页面也能够正常显示。
这样配置
android:configChanges="orientation"
那么横竖屏切换时就不会重新创建activity,那么这个属性到底是什么意思呢?
首先,要了解Android默认在情况下,在系统的配置改变的情况下会重新创建activity,这个很好理解,因为系统环境变了,当然要重新创建activity来适应这个改变喽。但是在很多时候我们不想在系统配置改变时重新加载activity,那么就需要
android:configChanges=“xxx|xxx”这个样子来搞定了。这里的xxx表这不同的系统配置的改变。
这里的xxx包含了很多种,就像我上边写的,可以用|来连接多个值。下面简单介绍下各个值的不同含义:
喝饱水,闭上嘴,往前走,靠双腿。
④ Android开发 :Fragment懒加载的几种方式与性能对比
TabLayout+ViewPager+Fragment是我们开发常用的组合。ViewPager的默认机制就是把全部的Fragment都加载出来,而为了保障一些用户体验,我们使用懒加载的Fragment,就是让我们再用户可见这个Fragment之后才处理业务逻辑。
而我们在一些设备或版本中可能就出现懒加载失效的问题。其实谷歌早就把一些懒加载的方案都标记弃用了,我们一直都用的老的随时会失效的Api。万一哪天彻底失效了就会导致线上事故。
接下来我们就看看Fragment的懒加载是如何演变的。谷歌又是推荐我们如何使用的。
在AndroidX还没出来的时候,大家的懒加载应该都是这样。判断setUserVisibleHint的方法,当用户可见的时候才回调方法去加载逻辑。
例如的我封装:
使用的示例:
扩展方法:
Fragment:
到此就实现了onLazyInitData的回调,只有出现Fragment显示在前台的时候才会调用方法,执行逻辑。
每次判断 setUserVisibleHint 和 onHiddenChanged 也麻烦,并且他们并不稳定,我也遇到过不回调的时候。
Android出来之后,给 FragmentStatePagerAdapter 添加了一个 @Behavior int behavior 的参数。
其本质就是内部帮你处理和切换MaxLifecycle:
如何使用呢:
之前的扩展方法以及预留了 behavior 参数,当为1的时候就不会回调 setUserVisibleHint 方法了,我们直接监听 OnResume 即可。
注意这个页面继承的就不是我们自定义的懒加载Fragment了。普通的Fragment 回调 onResume 即可。
ViewPager2出来之后。我们的 FragmentStatePagerAdapter 退出历史舞台。
即便能用,即便效果还是和ViewPage2的效果一样,但是还是标记废弃了。具体原因我也不知道,据说是因为老版本会出现问题导致数据丢失,页面空白。
ViewPage2我们都知道内部是通过RV实现的。但是对于Fragment的处理有单独的Adapter实现。
扩展方法:
使用:
使用的方式和ViewPager差不多,这里的Fragment也是使用普通的Fragment即可。
内存占用分别取三组数据
ViewPager数据
ViewPager2数据
结论 ViewPager2基于RV实现的效果还是比老版ViewPager要骚好一点。
并且老版本标记废弃,大家如果是用ViewPager2的话,还是推荐使用ViewPager2实现。如果大家还是用的老版本的ViewPager也推荐使用behavor参数。使用 onResume 实现懒加载的实现。以后再换到ViewPager2的话,可以无缝切换过来。
说明一下,测试数据仅供参考,毕竟我也不是专业测试,测试数据源也不不多。如有不对的地方,也望大家指正。