欢迎来到皮皮网官网

【健身应用app源码】【挂机源码PHP】【大话按键源码】inflate源码

时间:2024-11-25 00:54:32 来源:学生来源码表查询莆田

1.Android组件之Fragment(一)---基础知识与运用
2.ViewStub你肯定听过,但是这些细节了解吗?
3.android 什么时候必须用inflater
4.详解LayoutInflater.inflate()
5.setContentView()及LayoutInflater布局加载源码分析
6.Android中使用ViewStub提高布局性能

inflate源码

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

ViewStub你肯定听过,但是这些细节了解吗?

       1什么是ViewStub

       ViewStub是一个看不见的、不占空间的虚拟视图,用于懒加载布局。当它变为可见或执行inflate()方法时,健身应用app源码所指定的布局才会加载替换ViewStub。ViewStub存在于视图层次结构中,直到调用setVisibility(int)或inflate()方法。加载完成后,ViewStub会被移除,其占用的空间被新的布局替代。

       2ViewStub构造方法

       构造方法用于初始化ViewStub,关键方法包括setVisibility和inflate()。需要注意的是,ViewStub只能被inflate一次,inflate后ViewStub对象将被置为空。ViewStub仅用于加载一个布局文件,而不是特定的View。

       3inflate()方法解析

       inflate()方法是加载布局的关键实现,其核心在于将指定的挂机源码PHP布局加载到视图层次结构中,替换ViewStub。使用该方法时,ViewStub将执行其功能,并在加载完成后被移除。

       4WeakReference使用

       WeakReference用于管理对象的创建,确保内存资源的有效管理。在使用ViewStub时,WeakReference可以帮助避免内存泄漏问题。

       5ViewStub为何无大小与不绘制

       ViewStub在源码中被设计为无显示内容的特殊View,其draw和dispatchDraw方法被重写为不执行任何操作。onMeasure方法同样不执行任何操作,直接设置尺寸为0,以确保其在加载布局时不会占用任何空间。

       6ViewStub为何不绘制

       ViewStub通过设置WILL_NOT_DRAW标志来优化性能。当设置为true时,onDraw()方法将不会被调用,避免不必要的绘制过程,从而提高效率。

       7可以多次inflate()吗

       ViewStub对象只能被inflate一次,之后将被置为空。大话按键源码因此,再次尝试inflate将导致错误。理解其内部实现机制有助于避免常见的使用错误。

       8ViewStub不支持merge

       ViewStub不支持包含merge标签的布局文件。尝试使用这样的布局将导致异常,因此在设计布局时需注意这一点。

       9ViewStub使用场景

       ViewStub常用于处理页面状态切换,如显示数据为空、加载失败或网络错误的UI。它支持全局和局部定制,能够优化加载速度并减少资源消耗,提高用户体验。

       ViewStub总结分析

       掌握ViewStub的原理和应用有助于在实际开发中提高代码效率和用户体验。理解其内部机制,如构造方法、inflate()方法、为何无大小与不绘制等,对于合理使用ViewStub至关重要。

android 什么时候必须用inflater

       在实际开发中LayoutInflater这个类还是非常有用的,它的typescript 项目源码作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。 具体作用: 1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

       2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

       LayoutInflater 是一个抽象类,在文档中如下声明:

       publicabstractclass LayoutInflater extends Object

       获得 LayoutInflater 实例的三种方式

       1.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()

       2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService

        (Context.LAYOUT_INFLATER_SERVICE);

       3. LayoutInflater inflater = LayoutInflater.from(context);

       其实,这三种方式本质是相同的,从源码中可以看出:

       getLayoutInflater():

       Activity 的 getLayoutInflater() 方法是调用 PhoneWindow 的getLayoutInflater()方法,看一下该源代码:

       public PhoneWindow(Context context) { super(context); mLayoutInflater = LayoutInflater.from(context); }

       可以看出它其实是调用 LayoutInflater.from(context)。

       LayoutInflater.from(context):

       publicstatic LayoutInflater from(Context context) { LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) { thrownew AssertionError("LayoutInflater not found."); } return LayoutInflater; }

       可以看出它其实调用 context.getSystemService()。

       结论:所以这三种方式最终本质是都是调用的Context.getSystemService()。

       inflate 方法 通过 sdk 的 api 文档,可以知道该方法有以下几种过载形式,返回值均是 View 对象,如下:

       public View inflate (int resource, ViewGroup root) public View inflate (XmlPullParser parser, ViewGroup root) public View inflate (XmlPullParser parser, ViewGroup root, booleanattachToRoot) public View inflate (int resource, ViewGroup root, boolean attachToRoot)

       示意代码:

       LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test)); //EditText editText = (EditText)findViewById(R.id.content);// error EditText editText = (EditText)view.findViewById(R.id.content);

       对于上面代码,指定了第二个参数 ViewGroup root,11011011的源码当然你也可以设置为 null 值。

       注意:

       ·inflate方法与 findViewById 方法不同;

       ·inflater 是用来找 res/layout下的 xml 布局文件,并且实例化;

       ·findViewById() 是找具体 xml 布局文件中的具体 widget 控件(如:Button、TextView 等)。

详解LayoutInflater.inflate()

       LayoutInflater.inflate()是Android开发中常见方法,广泛应用于Fragment添加布局文件或RecyclerView Adapter为item添加布局。此方法接收三个参数:resource、root 和 attachToRoot。resource参数是目标布局文件,root参数为布局的根参数,attachToRoot参数决定是否将resource依附于root。

       官方文档解释,attachToRoot为true时,resource指定的布局文件会依附于root指定的ViewGroup,方法返回root参数,反之返回填充并返回resource指定的布局文件。具体实现参见源码。

       总结而言,attachToRoot参数决定布局文件的依附性,false时root仅用于创建正确的LayoutParams的子类,true时布局文件依附root。

       具体应用场景如下:

       1. inflate(R.layout.xxx,null):生成布局文件,宽高属性参照父布局,无效的宽高修改不会影响显示效果。

       2. inflate(R.layout.xxx,parent,false):加入父布局,布局文件的宽高属性有效,显示宽度和高度符合布局文件设定。

       3. inflate(R.layout.xxx,parent,true):加入父布局且依附root,布局文件依附root。若root为ListView等,调用addView方法时出错,因此在Adapter内使用attachToRoot为true会报错。适用于为Fragment创建布局时,布局文件会添加到父activity中盛放fragment的布局中。

setContentView()及LayoutInflater布局加载源码分析

       setContentView()和LayoutInflater布局加载源码深度解析

       当我们在Android应用中调用setContentView()时,其实涉及到了一系列复杂的流程。这个过程主要分为三个步骤:系统布局加载、LayoutInflater初始化以及LayoutInflater布局加载。

       首先,setContentView()方法通过Activity的PhoneWindow对象加载布局。在判断mContentParent是否为空后,会创建DecorView,然后将自定义的activity_main_layout加载到mContentParent,这个mContentParent对应id为R.id.content的Layout。接着,系统会加载一个包含R.id.content的系统布局到DecorView中。

       LayoutInflater的初始化过程关键在于其作为系统服务注册在SystemServiceRegistry中。当我们通过LayoutInflater.from(this)获取实例时,实际上是通过SystemServiceRegistry获取并初始化LayoutInflater的。

       LayoutInflater的布局加载流程则涉及xml预编译、View的反射创建以及递归解析子布局。在inflate方法中,会先检查根节点标签是否为"merge",然后决定是否递归加载子布局并决定是否添加到父布局中。View的创建则可能通过自定义的Factory进行拦截和定制。

       总结来说,setContentView()和LayoutInflater的交互使得我们能够灵活地加载和定制Activity的布局。通过理解这些源码细节,开发者可以更好地控制和优化应用的界面显示。

Android中使用ViewStub提高布局性能

       在Android开发中,使用ViewStub可以提升布局性能,特别是在面对复杂视图时。ViewStub是一种特殊的视图,能够在需要时延迟加载布局资源,从而提高整体性能。

       首先,我们了解一下ViewStub。它在Java编程中相当于一个用于替代其他代码的临时程序模块。具体到Android中,ViewStub用于延迟加载布局资源,避免在应用启动时加载不必要的视图。

       ViewStub的使用场景通常在布局中存在多个重复或动态生成的视图元素时。例如,在一个应用的首页,如果包含了一系列可以动态显示或隐藏的广告条,使用ViewStub可以在用户点击或滑动时动态加载和显示这些广告,从而提高性能。

       要使用ViewStub,只需在XML布局文件中使用``标签,并设置其`android:layout`属性指向要加载的布局资源。在代码中,可以通过调用`inflate()`方法或设置`visibility`为`VISIBLE`来触发布局的加载。

       值得注意的是,ViewStub不直接支持在布局中使用``标签。然而,通过间接的方式,如使用``标签,可以实现对特定视图的延迟加载。在验证过程中,直接使用``标签会导致崩溃,而使用间接方式则正常运行,表明ViewStub对间接引用的支持良好。

       深入理解ViewStub的实现方式,可以发现`inflate()`方法和`setVisibility()`方法的共同点在于它们都可以实现加载布局,但`setVisibility()`方法只在ViewStub首次延迟初始化且`visibility`属性非`GONE`时才调用`inflate()`方法。

       通过研究ViewStub的源码,我们可以更全面地理解其工作原理。此外,关于如何优化视图和提高布局性能的探讨,能够对开发者大有裨益。

       此外,作者计划在知乎上进行一场名为《我学安卓的那些套路》的直播分享会,旨在分享学习Android的经验和心得。直播内容涵盖了学习路径、常见问题解决策略、优化技巧等多个方面。对于对Android开发感兴趣或有疑问的朋友,欢迎参与直播,获取更多实用知识。

copyright © 2016 powered by 皮皮网   sitemap