那些年踩过的坑------include使用
记得早些年看网易云直播demo时,直播页面几乎全部使用的都是include来完成布局的,那么我们今天就来聊聊使用include。
前言
当我们再给一个带刷新、且无数据展示的列表页面进行布局的时候,尝尝会发现这些页面几乎是一样的,只是item不一致而已,那我们是不是需要在每一个activity的xml布局文件中都写一下呢?这样当然是可以的,但是大家都会发现,其实就是ctrl+c, ctrl+v 就搞定的事情。那如果我们要是再懒点,ctrl+c,ctrl+v都不想做,而且这样也会导致每个布局文件里面的代码比较多,我们就可以使用include标签来简单做到。
android的include标签就是为了便于我们的控件复用提供的一个很好的解决方案。
那我们该怎么用呢?
1)新建一个名叫include_titlebar_layout.xml 的xml文件,放入我们自定义的控件
<com.xxx.widget.titlebar.TitleBarView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40" />
2)在我们需要使用上述自定义控件的布局中如下:
<include
layout="@layout/include_titlebar_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<!--下面的几行可以不用,目前使用是因为在constraintLayout布局中,必须要重写layout_width ,layout_height 否则约束布局报错-->
如上就可以在activity ,Fragment或视图中使用了,使用和直接写自定义组件一样,
TitleBarView mTitleBar = this.findViewById(R.id.title_bar);
注意上述是没有给include标签添加 Id 的
3) include 指定 ID
<include
id="@+id/include_title"
layout="@layout/include_titlebar_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<!--给include指定了id -->
那我们还可以用 2)中的方法能获取到吗? 肯定是不行的,需要如下方法来获取:
//通过include指定的id来获取
TitleBarView mTitleBar = this.findViewById(R.id.include_title);
如果include_title_layout.xml使用了多层级的布局时,那我们就需要先获取到include指定ID的视图,再用视图调用findViewById来找子视图。
说明:
1.若给Include指定了ID , 就不能将他里面的控件当成主布局中的控件来使用,需要通过这个ID视图来找他里面的控件;而且会用这个ID来覆盖他里面布局的根布局ID;
2.如没有给Include指定ID ,那么他里面的控件就会被当成主布局中的控件来使用;
踩过的坑
1)笔者在使用ConstraintLayout的时候, 如app:layout_constraintTop_toTopOf="" 等此类的配置需要传入include的ID ,那么就给include指定了一个ID ,这时候发现原来include中的控件的使用都无效了,需要我们修改获取include子控件的方式,那这样对于一个优化版本来说简直是不友好的做法。
- 尝试直接找不到include子控件时,提供一个空方法,来返回include的根视图,共子类重写使用,那这样如果后续忘记了,就很难找到原因了
3)最后在app:layout_constraintTop_toTopOf=""中如果需要ID直接传入的是include 根布局的id ,如果根布局没有ID ,则再指定include的ID ,这样岂不美哉。
从include的使用背景,使用方法,到踩过的坑及解决办法,希望大家不要踩类似的坑了。
也欢迎遇到其他坑的同学留言,便于完善。