[Android个人理解(六)]使用include标签的注意事项

我们在使用include标签时是为了提高部分代码的重用性,同时增加代码的层次性和条理性。

但是在我们实际使用的时候,往往就会由于include的属性和include的原理不够清楚,而产生bug。

1、首先,我们说明include标签所在布局文件a和include所包含的布局文件b的关系

必须明确a和b通过使用include连接,与其说是包含,更像是拼接。Include不是View类,自然与其内的布局对象,不是嵌套关系。

我们都清楚,我们可以将a中的include标签删去,直接复制粘贴b的代码,这样是可以的。但是我们在使用的时候往往会出现,无法直接根据id找到b下的组件或者在一些组件中比如DrawerLayout无法识别b的组件等问题,但这些我们都可以当做对include理解的烟雾。上述原因是系统通过include标签识别xml文件的机制由于绕了一个圈,自然会出现当某些部分被重写后,直接调用的方法就失效的情况。(PS:个人理解,看不到include的源码,不知道include的具体实现)

2、然后由上,我们由拼接关系,我们就可以理解merge标签的必要性。

是告诉系统b布局文件是include下的一个合法的布局文件,可以直接拼接,以使b文件内的组件和a中include标签所在的附近组件是平级关系。平级关系的目的是优化UI结构,减少结点冗余。因为xml嵌套越多,系统需要遍历的次数也就越多。

3、问题又来了,既然是拼接关系,那么include的属性的作用是什么?

include的属性的意义是重写他包含的的根组件的属性,不仅仅是id,更多的是重写layout属性。Android开发的官方网站的说明这样提到:

“Similarly, you can override all the layout parameters. This means that any android:layout_* attribute can be used with the tag.”

意思是任何android:layout_*属性都可以应用在标签中。含义有两层,一是必须同时重载layoutwidth和layoutheight熟悉,其他的layout_*属性才会起作用,否这都会被忽略掉。另一层是只能在include属性写layout_*属性。因为还是上面的原因,include没有实际意义,重写的属性的目的就是确定b布局文件的拼接位置。

同时我们也很容易明白,因为重写了根布局的属性,b文件下的根布局的layout就不起作用了。

4、还是由上个问题,我们引出include标签的id属性。不仅仅如果include指定了id的话,就不能直接把它里面的控件当成主xml中的控件来直接获得了,必须先获得这个xml布局文件,再通过布局文件findViewById来获得其子控件。当没有指定id的时候,只能直接this. findViewById来获得其子控件。至于原因,我们还是归因于对include下的布局文件的调用机制。

在实际运用中,我因为include出现过两次bug,在这里分享一下。

Bug1:DrawerLayout对内容布局如果使用include标签,但没有声明width和height属性的话,组件不识别。这类似于对左抽屉和右抽屉的xml属性要求大致相同,必须有android:layout_gravity=”start”和android:layout_width或者end一样。

源码如下:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <include layout="@layout/flame_layout"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

    <LinearLayout
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start" >

        <include layout="@layout/drawer_left" />
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

Bug2:自定义weight的使用时无响应。

事实上是因为我们没有选中对应的组件,有时会报NullPointExceptiom,有时就是自定义组件的监听无响应,当时我们推测的原因有OnClik和Ontouch传值的问题,自定义组件内部的监听事件等,实际上只是include是否指定id,和findViewById方法的对象选择问题。而像include这样的细节问题往往是最难发现的。

最后我其实想过,如果在include标签外加一个layout标签,以上的问题就不需要考虑了,这篇文章也就没有必要了。但是这就回到了上面问题2,尽量的减少布局的嵌套,这也是Android中 merge的用心所在。

时间: 2024-10-18 15:11:34

[Android个人理解(六)]使用include标签的注意事项的相关文章

Android手机应用开发之include标签使用

android中include标签是为了便于控件的覆用的一个很好解决方案. 但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看. include标签用法. 1.新建一个xml文件,命名 head.xml head.xml文件内容如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.

Android Include标签

编程的世界有的时候很微妙,有的时候就好像是在解决一个哲学问题,Android开发的时候,所有的布局,颜色,等(其实这些都可以称之为资源,Android中的资源是指非代码部分,如图片.音频.视频.字符等资源,其实就是可以被代码所操作的一些对象)都可以用XML文件布局,而所有对这些XML的操作可以在相应的Activity中进行,这种分离似乎将程序员和美工进行分离. 一个系统中,往往会有重复的界面,或者被划分的可以复用的逻辑单元,这个时候的解决方法往往是,做好一个之后,然后进行Copy.android

include标签布局和自定义标题

在Android的性能优化是,可以使用抽象布局标签(include,ViewStub,merge),include去除不必要的嵌套和View节点,merge减少不必要的inflate以及其他Layout,viewstub可以隐藏view. include标签常用于将布局中的公共部分提取出来供其他layout公用,以实现布局模块化,这在布局编写方便提供了便利. activity_main.xml <Linear xmlns:android="http://schemes.android.co

Android里merge和include标签的使用

1.使用<include /> 标签来重用layout代码 如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在android开发文档中没有相关的介绍.在android主屏程序中 用到了这个标签: view plain ·········10········20········30········40········50········60········70········80········90········100···

Android 布局中的include标签使用

Android 布局中的include标签使用 最近在布局时,有好多页面都是有共同特点的,比如标题:一个同样的样式! 如下图所示: 如果给每个页面都单独的写一个标题的布局那就太麻烦了,如果能写一个标题布局,其它页面重用该多好! 这个时候,<include> 就隆重登场了! 写一个标题的布局 title.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:an

android中include标签使用详解

android中include标签是为了便于控件的覆用的一个很好解决方案. 但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看. include标签用法. 1.新建一个xml文件,命名 head.xml head.xml文件内容如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.

android中include标签的使用

转自:http://blog.sina.com.cn/s/blog_a364999b01017gxi.html android中include标签是为了便于控件的覆用的一个很好解决方案. 但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看. include标签用法. 1.新建一个xml文件,命名 head.xmlhead.xml文件内容如下:<?xml version="1.0" encoding="utf-8"?>&

Android中include标签的使用及注意事项

前言 ??include标签可以实现在一个layout中引用另一个layout的布局,这通常适合于界面布局复杂.不同界面有共用布局的APP中,比如一个APP的顶部布局.侧边栏布局.底部Tab栏布局.ListView和GridView每一项的布局等,将这些同一个APP中有多个界面用到的布局抽取出来再通过include标签引用,既可以降低layout的复杂度,又可以做到布局重用(布局有改动时只需要修改一个地方就可以了). 使用方法 ??include标签的使用很简单,只需要在布局文件中需要引用其它布

Android中View绘制优化二一---- 使用&lt;include /&gt;标签复用布局文件

本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 译二: 使用<include />标签复用布局文件  翻译地址:http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge 尽管Android通过内置了各种各样的控件提供了微小.可复用的交互性元素,也许你需要复用较大的 组件 ---- 某些特定布局文件 .为了更有效率复用的布局文件,你可以使用<