皮皮网

【dug源码】【thinkphp答题网站源码】【积分下单网站源码】fragment源码分析

2024-11-23 08:41:34 来源:欧特克源码

1.Android组件之Fragment(一)---基础知识与运用
2.从源码方面来分析Fragment管理中 Add() 方法
3.Android-Fragment源码分析
4.URP管线PBR源码剖析(上)
5.Navigation源码解析及自定义FragmentNavigator详解

fragment源码分析

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地址

从源码方面来分析Fragment管理中 Add() 方法

       本文深入解析了Android中Fragment管理中的关键方法——Add()。Add()方法作为添加Fragment的分析基础操作,其用法直观且简便。源码例如,分析向Activity中添加一个Fragment的源码代码如下:

       getSupportFragmentManager().beginTransaction().add(R.id.fragmenta,new FragmentA()).commit();

       在实际应用中,我们通常需要添加多个Fragment以实现界面的分析dug源码动态切换。如微信底部导航栏,源码每个按钮对应一个不同的分析Fragment。通过Add()方法配合hide和show,源码可以实现Fragment之间的分析平滑切换。

       我们以两个Fragment为例,源码实现了MainActivity的分析布局和内容。通过简单的源码代码实现,我们观察到Fragment的分析生命周期。初次运行时,源码输出如下日志;点击FragmentB后,再次点击FragmentA和B时,日志显示FragmentA和B只会初始化一次,证明了通过hide和show进行切换时,初始化效果的实现。

       接着,我们介绍了replace方法。thinkphp答题网站源码replace方法实际上包含了remove和add的组合,用于在FragmentManager中替换Fragment。若切换到下一个Fragment时,上一个Fragment不再需要,可以使用replace方法。若需要保留上一个Fragment,API提供了相应的addBackToStack方法。

       修改MainActivity代码中的逻辑,再次执行并观察日志。在初次初始化时,日志保持一致;点击FragmentB后,发现Fragment调用了destroy方法,而点击FragmentA时,界面显示的仍是FragmentB。此时,我们修改了逻辑,使得每次切换时,Fragment都会重新调用onCreateView到onDestroyView的所有方法,实现了布局层的完整销毁和重建。

       特别提醒,当进行Fragment嵌套时,积分下单网站源码若需要在返回时跳过中间的Fragment,使用FragmentManager.popBackStackImmediate方法可以实现弹出指定TAG的Fragment,并清除其之前的Fragment,从而实现更深层次的返回。

       本文代码示例和完整代码资源可以通过点击此处传送门获取,或者查看下方小卡片。

       最后,我想强调的是,技术的追求永无止境。对于程序员而言,不断提升自己,对每一行代码、每一个工具负责,深入理解其底层原理,是提升技术能力的关键。Android架构师之路漫长而艰辛,与君共勉。

Android-Fragment源码分析

       Fragment是Android系统为了提高应用性能和降低资源消耗而引入的一种更轻量级的组件,它允许开发者在同一个Activity中加载多个UI组件,实现页面的切换与回退。Fragment可以看作是vue拖拽建站源码Activity的一个子部分,它有自己的生命周期和内容视图。

       在实际应用中,Fragment可以用于构建动态、可复用的UI组件,例如聊天应用中,左右两边的布局(联系人列表和聊天框)可以分别通过Fragment来实现,通过动态地更换Fragment,达到页面的切换效果,而无需整个页面的刷新或重新加载。

       在实现上,v4.Fragment与app.Fragment主要区别在于兼容性。app.Fragment主要面向Android 3.0及以上版本,而v4.Fragment(即支持包Fragment)则旨在提供向下兼容性,支持Android 1.6及更高版本。使用v4.Fragment时,需要继承FragmentActivity并使用getSupportFragmentManager()方法获取FragmentManager对象。尽管从API层面看,两者差异不大,但官方倾向于推荐使用v4.Fragment,以确保更好的兼容性和性能优化。

       下面的pytorch源码编译提速示例展示了如何使用v4.Fragment实现页面的加载与切换。通过创建Fragment和FragmentActivity,我们可以加载特定的Fragment,并在不同Fragment间进行切换。

       在FragmentDemo的布局文件中,定义了Fragment容器。

       在Fragment代码中,定义了具体的业务逻辑和视图渲染,如初始化界面数据、响应用户事件等。

       在Activity代码中,通过FragmentManager的beginTransaction方法,加载指定的Fragment实例,并在需要时切换到不同Fragment,实现页面的动态更新。

       从官方的建议来看,v4.Fragment已经成为推荐的使用方式,因为它在兼容性、性能和功能方面都更优于app.Fragment。随着Android系统的迭代,使用v4.Fragment能确保应用在不同版本的Android设备上均能获得良好的运行效果。

       在Fragment的生命周期管理中,Fragment与Activity的生命周期紧密关联。通过FragmentManager的操作,如commit、replace等,可以将Fragment加入到Activity的堆栈中,实现页面的加载与切换。当用户需要返回时,系统会自动将当前Fragment从堆栈中移除,从而实现页面的回退。

       深入Fragment源码分析,我们可以了解其如何在底层实现这些功能。Fragment的初始化、加载、切换等过程涉及到多个关键类和方法,如FragmentManager、FragmentTransaction、BackStackRecord等。通过这些组件的协作,Fragment能够实现与Activity的生命周期同步,确保用户界面的流畅性和高效性。

       在实际开发中,使用Fragment可以显著提高应用的响应速度和用户体验。通过动态加载和切换不同的Fragment,开发者可以构建出更加灵活、高效的应用架构,同时减少资源的消耗,提高应用的性能。

URP管线PBR源码剖析(上)

       URP管线与PBR算法的联系并不直接,但新版本的代码结构和算法有了显著变化。本文将深入剖析URP管线下的内置PBR着色器,对比旧版本,探讨主要区别。

       此篇内容旨在学习和解答问题,期待大家的反馈和讨论。以下分析分为三步:

       梳理UniversalFragmentPBR函数的功能和代码结构

       解析通用PBR算法

       详解ClearCoatPBR算法

       首先,UniversalFragmentPBR的主要工作分为数据准备和光照计算。数据准备包括初始化BRDF数据、ClearCoat BRDF数据、shadowMask、获取主光源信息和处理SSAO等。光照计算则涵盖了间接光和直接光的计算,如GI、主光、额外像素和顶点光照等。

       通用PBR算法的关键部分包括BRDF数据初始化,其中金属和非金属材质的处理有所不同;间接光的计算涉及漫反射和镜面反射;主光光照计算使用了改良的Lambert和Cook-Torrance模型;额外光计算则根据光源类型进行相应调整。

       URP版本与旧版的不同点在于支持ClearCoat材质、ShadowMask功能、SSAO效果的整合,以及额外光处理的简化。整体来看,新版本的PBR算法更加灵活且高效。

Navigation源码解析及自定义FragmentNavigator详解

       谷歌推出的Navigation主要目标是统一应用内页面跳转行为。使用方法简单,新项目选择Bottom Navigation Activity,系统自动生成页面逻辑。

       Navigation源码设计简洁,包含多个关键类。其中,NavHostFragment是直接在XML文件中定义的,其生命周期方法onCreate中直接创建了NavHostController,并通过findNavController暴露给外部调用者。NavHostController继承自NavController。在此过程中,通过navController获取NavigatorProvider并添加了两个Navigator:DialogFragmentNavigator和FragmentNavigator。NavController构造方法中还额外添加了两个Navigator,分别对应DialogFragment、Fragment和Activity的页面跳转。NavGraphNavigator用于在XML配置的navGraph与根节点文件中的startDestination之间实现跳转,功能单一。

       各个Navigator通过重写navigate方法实现各自的跳转逻辑。FragmentNavigator的关键实现在于注释1处,使用replace加载Fragment,这不符合实际开发需求。文章后续将解释如何自定义FragmentNavigator以避免Fragment在切换时执行生命周期。

       NavigatorProvider内部维护了一个HashMap存储相关Navigator信息,通过获取Navigator的注解Name作为键和getClass作为值进行存储。在onCreate方法中,mNavController调用了setGraph,解析XML配置的mobile_navigation节点信息文件,根据不同的节点各自解析。通过获取NavInflater进行解析,返回NavGraph,NavGraph继承自NavDestination,保存了所有解析出的节点信息。

       总结,通过NavHostFragment获取到NavContorl并存储了相关Navigator信息。通过各自navigate方法进行页面跳转,通过setGraph解析配置的页面节点信息并封装为NavGraph对象。其中,通过SparseArray存储Destination信息。

       自定义Navigator实现思路主要在于继承现有FragmentNavigator并重写其navigate方法,将replace方法替换为show和hide方法,完成Fragment切换。通过@Navigator.Name(value)注解标记自定义类为Navigator,加入NavigatorProvider中即可识别。自定义Navigator核心代码实现后,需调整mobile_navigation节点中的fragment为fixFragment,并删除布局文件中NavHostFragment节点信息,手动关联FixFragmentNavigator与NavControl,完成Fragment切换时生命周期不会重新执行。