zoukankan      html  css  js  c++  java
  • 创建自定义的控件

          由上图可以看出,所有的控件都直接继承或间接继承自View类,所有的布局都是直接或间接继承自ViewGroup。View是Android中一种最基本的UI组件,它可以在屏幕上绘制一个矩形区域,并能相应这块区域的各种事件,因此,Android系统中的各种控件其实就是在View的基础上又添加了各自特有的功能。而ViewGroup则是一种特殊的View,它可以包含很多的子View和子ViewGroup,是一个用于放置控件和布局的容器。

    引入布局

          假如需要为一个应用中的所有活动添加一个自定义的标题栏,在之前我们可以在每个活动的布局中定义标题栏。但是如果活动很多的话,就会有很多的重复,所以为了避免重复,我们可以引入布局。

         1.首先新建一个布局title.xml。这就是一个标题布局文件。

         2.在每一个需要使用标题的活动的布局文件中引入这句代码:<include layout="@layout/title"/>,如下图:

            

             最后别忘了在onCreate方法中将系统自带的label隐藏掉。

    创建自定义控件

           引入布局确实解决了重复编写布局代码的问题,但是如果布局中一些空间要求响应事件,还需要在每个活动中为这些控件单独编写一次注册的代码。比如说标题栏中的返回按钮,其实不管在哪一个活动中,功能都是一样的,即销毁当前活动。而如果在每一个活动中都需要重新注册一遍返回按钮的点击事件,无疑又是增加了很多重复的代码,这种情况最好使用自定义控件来解决。

    将标题栏变为一个自定义控件,步骤如下:

        1.新建TitleLayout继承自LinearLayout,让它称为我们自定义的标题栏控件,代码如下:

         

          首先重写了LinearLayout中带有两个参数的构造函数,在布局文件中引入TitleLayout控件就会调用这个构造函数。然后在构造函数中需要对标题栏进行动态加载,这就需要借LayoutInflater来实现了。通过LayoutInflater的from()方法可以构建一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件了,inflate()方法接收两个参数,第一个参数是要加载的布局文件id,这里我们传入R.layout.title,第二个参数是给添加好的布局再添加一个父布局,这里我们想要指定TitleLayout,于是就直接传入了this。

         2.之后就可以在布局文件中引用该自定义控件了。如下图:

         

          添加自定义控件和添加普通控件的方式基本是一样的,只不过在添加自定义控件的时候需要指明控件的完整类名(本人是这么理解的,系统提供的控件有一个默认的存储路径,自定义的控件如果不写完整的路径,就会去系统默认的路径下寻找,当然是找不到的)。然后我们在TitleLayout.java中定义响应事件,然后每一个使用该自定义控件的活动都不需要再重复定义响应事件了。

  • 相关阅读:
    KMP
    KMP算法的Next数组详解
    从头到尾彻底理解KMP
    通信协议:HTTP、TCP、UDP
    十大Intellij IDEA快捷键
    Java连接oracle数据库的两种常用方法
    Oracle 数据类型
    Oracle 数据库、实例、用户、表空间、表之间的关系
    Android中的Handler的机制与用法详解
    在Android开发中,定时执行任务的3种实现方法
  • 原文地址:https://www.cnblogs.com/hujingwei/p/5104521.html
Copyright © 2011-2022 走看看