include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件。...include适用于多个布局文件中存在相同的xml片段,比如说相同的标题栏、相同的广告栏、相同的进度栏等等。...include子布局文件的根节点可以是LinearLayout或RelativeLayout或FrameLayout,可是上级布局文件往往已经有了相同的视图节点,这时子布局的根节点就变成冗余的了,但是布局文件又必须有根节点...好处一个是减少了布局文件的大小,另一个是方便以后统一修改风格。...从截图可以看到,windowFrame的覆盖区域包括窗口与边框,且窗口对内半透明、对外不透明,而边框对外半透明。
onCreateView() 系统会在片段首次绘制其界面时调用此方法。如要为片段绘制界面,从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供界面,可以返回 null。...如要为片段提供布局,必须实现 onCreateView() 回调方法,Android 系统会在片段需要绘制其布局时调用该方法。此方法的实现所返回的 View 必须是片段布局的根视图。...container 参数是片段布局将插入到的父级 ViewGroup(来自 Activity 的布局)。...(在本例中,此值为 false,因为系统已将扩展布局插入 container,而传递 true 值会在最终布局中创建一个多余的视图组。) 接下来,需将该片段添加到您的 Activity 中。...例如,以下示例说明如何将一个片段替换为另一个片段,以及如何在返回栈中保留先前的状态: // Create new fragment and transaction Fragment newFragment
,它可以重写插入主布局的布局id。...前面说了merge并不会作为一个布局绘制出来,所以这里给它设置id是不起作用的。...与include标签不同,ViewStub的android:id属性是设置ViewStub本身id的,而不是重写布局id,这一点可不要搞错了。...这样一来,在mInflatedViewRef不为空,也就是已经填充了布局的情况下,ViewStub中的setVisibility()方法实际上是在设置内部视图的可见性,而不是ViewStub本身。...毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者! 腾讯T3大牛带你了解 2019 Android开发趋势及必备技术点!
从 Android Studio 3.6 开始,视图绑定能够通过生成绑定对象来替代 findViewById,从而可以帮您简化代码、移除 bug,并且从 findViewById 的模版代码中解脱出来...布局的根视图(无论有没有 id)都会自动生成一个名为 root 的属性。...一个常见的错误用法是: 在开启了视图绑定的同时,依然在 setContentView(...) 中传入布局的 id 而不是绑定对象。...使用绑定对象编写安全性更佳的代码 findViewById 是许多用户可见 bug 的来源: 我们很容易传入一个布局中根本不存在的 id,从而导致空指针异常而崩溃;由于此方法类型不安全,也很容易使人写出像...我们之所以开发视图绑定作为数据绑定的补充,是因为许多开发者反映说,希望有一个轻量的解决方案,能在数据绑定之外替代 findViewById——视图绑定提供的正是这一功能。
例如:新闻应用可以使用一个片段在左侧显示文章列表,使用另一个片段在右侧显示文章—两个片段并排显示在一个 Activity 中,每个片段都具有自己的一套生命周期回调方法,并各自处理自己的用户输入事件。...因此,用户不需要使用一个 Activity 来选择文章,然后使用另一个 Activity 来阅读文章,而是可以在同一个 Activity 内选择文章并进行阅读,如下图中的左侧平板电脑布局所示。...也就是说,由于每个片段都会通过各自的生命周期回调来定义其自己的布局和行为,您可以将一个片段加入多个 Activity,因此,您应该采用可复用式设计,避免直接从某个片段直接操纵另一个片段。...这特别重要,因为模块化片段让您可以通过更改片段的组合方式来适应不同的屏幕尺寸。 在设计可同时支持平板电脑和手机的应用时,您可以在不同的布局配置中重复使用您的片段,以根据可用的屏幕空间优化用户体验。...,就是要包含Fragment的包名,另外 fragment必须用id或tag作为唯一标识 Step 4: Activity在onCreate( )方法中调用setContentView()加载布局文件即可
例如上述例子中,include时设置了该布局的id为my_title_ly,而my_title_layout.xml中的根视图的id为my_title_parent_id。...我们看到,注释5处的会判断include标签的id如果不是View.NO_ID的话会把该id设置给被引入的布局根元素的id,即此时在我们的例子中被引入的id为my_title_parent_id的根元素...所以结论就是: 如果include中设置了id,那么就通过include的id来查找被include布局根元素的View;如果include中没有设置Id, 而被include的布局的根元素设置了id,...然后就是ViewStub从parent中移除、把目标布局的根元素添加到parent中。...最后会把目标布局的根元素返回,因此我们在调用inflate()函数时可以直接获得根元素,省掉了findViewById的过程。
而 findViewById()是找具体某一个xml下的具体 widget控件(如:Button,TextView等)。...= null, attachToRoot == true 传进来的布局会被加载成为一个View并作为子View添加到root中,最终返回root; 而且这个布局根节点的android:layout_xxx...布局根View的android:layout_xxx属性会被解析成LayoutParams并设置在View上,此时root只用于设置布局根View的大小和位置。...加载xml布局的原理 从根节点开始,递归解析xml的每个节点。...同时会解析对应xml节点的属性作为View的属性。
概述 在我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样会导致很多的模版代码出现。...所以其主要解决如何安全优雅地从代码中引用到XML layout文件中的view控件的问题。直到目前为止,Android构建用户界面的主流方式仍然是使用XML格式的layout文件。...enabled = true } …………… } 如果在使用的过程中开发者不想为某个布局文件生成binding类,则可以使用如下属性添加到布局的根视图中即可: 的赋值给一个Button变量,都会报错,这一错误很容易出现,关键在错误还出现在运行时,而不是编译时!...[在这里插入图片描述] 欢迎关注公众号(longxuanzhigu),获得更多福利、精彩内容哦! [在这里插入图片描述]
概述 在我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样会导致很多的模版代码出现。...所以其主要解决如何安全优雅地从代码中引用到XML layout文件中的view控件的问题。直到目前为止,Android构建用户界面的主流方式仍然是使用XML格式的layout文件。...enabled = true } …………… } 如果在使用的过程中开发者不想为某个布局文件生成binding类,则可以使用如下属性添加到布局的根视图中即可: <androidx.constraintlayout.widget.ConstraintLayout...如下图所示: 在这里插入图片描述 使用此生成类引用XML布局文件中的控件 调用生成类ActivityDescriptionBinding的inflate()方法获得类实例对象,通过getRoot()方法可以获得...TextView错误的赋值给一个Button变量,都会报错,这一错误很容易出现,关键在错误还出现在运行时,而不是编译时!
会覆盖被include的xml文件根节点对应的layout_xx属性,建议在include标签调用的布局设置好宽高位置,防止不必要的bug include 添加id,会覆盖被include的xml文件根节点...2.某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。...merge标签使用: 在XML布局文件的根布局如RelativeLayout直接改成merge即可 merge使用注意 1.因为merge标签并不是View,所以在通过LayoutInflate.inflate.... 3.注意如果include的layout用了merge,调用include的根布局也使用了merge标签,那么就失去布局的属性了 4.merge标签必须使用在根布局 5.ViewStub标签中的...先来看看布局,一个是主布局,里面只定义二个ViewStub,一个用来控制TextView一个用来控制ImageView,另外就是一个是为显示文字的做的TextView布局,一个是为ImageView而做的布局
不过,好在ViewBinding并不复杂,从kotlin-android-extensions插件切换到ViewBinding也是比较容易的,那么本篇文章就作为《第一行代码 第3版》的另外一篇DLC,向大家介绍一下...当然这个我认为并不是主要原因,因为现在Google开发的各种新技术都在全面兼容Kotlin,而不再怎么去考虑Java了,如协程、Jetpack Compose等。 那么主要原因是什么呢?...那么接下来,我们的学习目标就变成了:如何使用ViewBinding来替代之前的kotlin-android-extensions插件。请放心,这并不是一件很难的事情。...而RecyclerView把ListView中的这个普遍应用的最佳实践直接作为默认实现集成了进去,所以只要我们使用RecyclerView,就一定要写ViewHolder。...merge和include最大的区别在于,使用merge标签引入的布局在某些情况下可以减少一层布局的嵌套,而更少的布局嵌套通常就意味着更高的效率。
视图绑定模块默认为全部布局生成绑定类 ; 视图绑定 ( ViewBinding ) 模块一旦启用 , 应用的全部布局都会默认自动生成一个视图绑定类 , 如果生成了视图绑定模块 , 是否对于已经使用的 findViewById...Android 官方文档中给出的定制方案 : 如果当前有几百个布局文件 , 为了不影响之前的代码 , 可以在每个布局的根视图上配置 tools:viewBindingIgnore=“true” 属性 ;..., 该布局的视图组件与 ActivityMainBinding 没有任何关联 , Activity 显示的组件也不是 ActivityMainBinding 绑定类中的组件 , 因此操作视图绑定类中的组件不能修改...(getLayoutInflater()); /* ActivityMainBinding 绑定类自带 getRoot() 方法 可以直接获取到 布局文件的 根视图 这里可以直接将根视图传递给...setContentView 函数作为参数 , 即可在该 Activity 中显示该布局 */ setContentView(binding.getRoot()); 5 .
= null) { //用传入的contentParent父布局生成参数给根视图 params = root.generateLayoutParams(attrs...= null && attachToRoot) { //传入的contentParent作为父布局 root.addView(temp, params);...} //没有传入父布局,就直接返回根视图 if (root == null || !...如果个别布局不需要开启ViewBinding,可以给布局的根标签加上tools:viewBindingIgnore="true"。..._$_findViewCache.put(var1, var2); } return var2; } } 至于kotlin如何插入这些代码的,能力有限,哈迪也不知道
DOM 元素 在触发回流(重排)时,由于浏览器渲染页面是基于流式布局的,所以当触发回流时,会导致周围的 DOM 元素重新排列,它的影响范围有两种: 全局范围:从根节点开始,对整个渲染树进行重新布局 局部范围...可以修改类名,而不是样式 使用 absolute 或 fixed 使元素脱离文档流,这样他们发生变化就不会影响其他元素 避免频繁操作 DOM,可以创建一个文档片段 documentFragment,然后把需要操作的元素添加到文档片段中...将 DOM 的多个读操作(或者写操作)放在一起,而不是读写操作穿插着写,这得益于浏览器的渲染队列机制 浏览器针对页面的回流与重绘,使用渲染队列进行了自身的优化 浏览器会将所有的回流、重绘的操作放到一个队列中...它被作为一个轻量版的 Document 使用,就像标准的 document 一样,存储由节点(nodes)组成的文档结构。...当我们把一个 DocumentFragment 节点插入文档树时,插入的不是 DocumentFragment 自身,而是它的所有子孙节点。
应将各类资源放入项目 res/ 目录的特定子目录中。 - 布局容器 布局可定义应用中的界面结构(例如 Activity 的界面结构)。...- Activity Activity类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是该平台应用模型的基本组成部分。...应用中的一个 Activity 会被指定为主 Activity,这是用户启动应用时出现的第一个屏幕。然后,每个 Activity 可以启动另一个 Activity,以执行不同的操作。...与 Activity 生命周期协调一致 片段所在 Activity 的生命周期会直接影响片段的生命周期,其表现为,Activity 的每次生命周期回调都会引发每个片段的类似回调。...Fragment 传递到父级 Fragment,父级 Fragment 在调用 setFragmentResultListener() 时应使用 getChildFragmentManager() 而不是
下面以在一个布局main.xml中用include引入另一个布局foot.xml为例。...注意: 使用include最常见的问题就是findViewById查找不到目标控件,这个问题出现的前提是在include时设置了id,而在findViewById时却用了被include进来的布局的根元素...例如上述例子中,include时设置了该布局的id为my_foot_ly ,而my_foot_ly.xml中的根视图的id为my_foot_parent_id。...我们看到,注释5处的会判断include标签的id如果不是View.NO_ID的话会把该id设置给被引入的布局根元素的id,即此时在我们的例子中被引入的id为my_foot_parent_id的根元素RelativeLayout...所以结论就是: 如果include中设置了id,那么就通过include的id来查找被include布局根元素的View;如果include中没有设置Id, 而被include的布局的根元素设置了id,
注意事项 使用include最常见的问题就是findViewById查找不到目标控件,这个问题出现的前提是在include时设置了id,而在findViewById时却用了被include进来的布局的根元素...例如上述例子中,include时设置了该布局的id为my_title_ly,而my_title_layout.xml中的根视图的id为my_title_parent_id。...2.解析include的布局的根元素 3.获取include包含布局的布局属性并设置 4.解析根元素下的子view 5....来查找,而这个id并不是就是ViewStub的id,而是inflatedId。...findViewById的问题,注意ViewStub中是否设置了inflatedId,如果设置了则需要通过inflatedId来查找目标布局的根元素。
多层布局的嵌套会导致页面加载慢,影响用户的体验,今天我们就来学学如何使用 include,merge及viewStub。...原来:如果给include设置了id,就会覆盖掉引用布局根布局的id,所以解决办法用两种: 第一种直接获取include的id,进行findviewByid() 第二种将两者的id取名一致 我们选取第一种...image.png 2.merge merge标签是作为include标签的一种辅助扩展来使用的,也就是需要和include一起使用,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。...image.png 欧克,我们看看我们将include中的布局改为merge,注意:merge必须放在布局文件的根节点上。...根布局的ViewGroup的id,layout是要加载的布局。
mContentParent 即放置我们自己布局的容器,你可以理解为,它是我们的根布局,详情看图。...mDecor 是 windows 唯一视图,也就是我们 mContentParent 的爸爸。简称 DecorView,是不是回忆起了点什么。...() ; 而 PhoneWindows 的 setContentView() 内部会先判断当前有没有根布局 contentParent,也即就是有没有 DecorView,如果没有,执行 installDecor...,没有的话,就去根据当前主题,选择一个布局,并将其当做我们的根布局添加到 DecorView 中; 最后 PhoneWindows-setContentView() 方法接下来就可以将我们自己的布局 inflate...进这个根布局里了;