Android学习之基础知识五—创建自定义控件
下面是控件和布局的继承关系:
从上面我们看到:
1、所有控件都是直接或间接继承View,所有的布局都是直接或间接继承ViewGroup
2、View是Android中最基本的UI组件,各种组件其实就是在View的基础上又添加了各自特有的功能。
3、ViewGroup是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个用于放置控件和布局的容器。
一、引入布局
问题引入:在一个项目中存在一个标题栏,该项目中的许多活动都使用了该标题栏,如果在每个活动中都写一遍标题栏的代码,会导致代码的大量重复。
问题解决:把标题栏布局代码单独写出来,然后在每个活动的布局中引入标题栏布局即可
第一步:创建一个新项目:UICustomViews,创建标题栏布局:title.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"> <Button
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="Back" />
<TextView
android:id="@+id/title_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:layout_gravity="center"
android:text="Text View"
android:textSize="24sp"/>
<Button
android:id="@+id/title_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="Edit" />
</LinearLayout>
第二步:在activity_main.xml中引入title布局:
第三步:在MainActivity活动中隐藏系统自带的标题栏
第五步:运行结果
代码分析:
android:background属性:为布局或控件指定一个背景
android:margin属性:指定控件在上下左右方向上偏移的距离,也可以使用android:layout_marginLeft或android:layout_marginTop等属性来单独指定控件在某个方向上偏移的距离
<include layout="@layout/title"/>:引入title布局
getSupportActionBar()方法:获取ActionBar的实例,然后调用:hide()方法将标题栏隐藏起来。
二、创建自定义控件
创建自定义控件过后,与普通控件的用法一样
第一步:创建TitleLayout控件类,继承LinearLayout
第二步:在布局文件中添加自定义控件
第三步:在TitleLayout控件中添加按钮点击事件:点击Back,退出程序,点击Edit,弹出一个提示信息
第四步:运行程序,点击Back,退出程序;点击Edit,弹出提示信息
代码分析:
1、TitleLayout控件继承LinearLayout布局后,重写LinearLayout中带有两个参数的构造函数TitleLayout,在布局中引入TitleLayout控件时就会调用该构造函数。
2、借助LayoutInflater来实现对标题栏布局的动态加载:
通过LayoutInflater的:from()方法来构建一个LayoutInflater的对象。然后通过调用:inflater()方法就可以动态加载一个布局文件,在inflater()方法中传入两个参数,一个是要加载的布局文件的id,这里我们要加载的是title这个布局文件,所以这里传入的就是:R.layout.title;另外一个参数是给加载好的布局添加一个父布局,这里我们想要指定为TitleLayout,于是就传入this.
3、添加自定义控件时,需要指定控件的完整类名,包名在这里是不可以省略的:com.workspace.hh.uicustomviews.TitleLayout
Android学习之基础知识五—创建自定义控件的更多相关文章
- Android学习之基础知识五—Android常用的七大控件
一.TextView控件:在界面上显示一段文本信息 先看XML代码和执行效果: 代码分析: 1.android:id属性,给当前控件定义了一个唯一的标识符 2.android:layo ...
- Android学习之基础知识五—RecyclerView(滚动控件)
RecyclerView可以说是增强版的ListView,不仅具有ListVIew的效果,还弥补许多ListView的不足. 一.RecyclerView的基本用法 与百分比布局类似,Recycler ...
- Android学习之基础知识五—ListView控件(最常用和最难用的控件)
ListView控件允许用户通过上下滑动来将屏幕外的数据拉到屏幕内,把屏幕内的数据拉到屏幕外. 一.ListView的简单用法第一步:先创建一个ListViewTest项目,在activity_mia ...
- Android学习之基础知识五—编写聊天界面
第一步:在app/build.grandle添加RecyclerView依赖库 第二步:在activity_main.xml文件中编写主界面:聊天.发送框.发送按钮三个部分 第三步:编写Message ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
- Android学习之基础知识七—碎片的使用
碎片(Fragment)是一种可以嵌入在活动中的UI片断,它能让程序更加合理和充分地利用大屏幕的空间,它与活动相似,可以简单的理解为一个迷你型的活动,它也有自己的生命周期.碎片在平板的应用非常广泛. ...
- Android学习之基础知识二(build.gradle文件详解)
一.详解build.gradle文件 1.Android Studio是采用Gradle来创建项目的,Gradle是非常先进的构建的项目的工具,基于Groovy领域特定的语言(DSL)来声明项目配置, ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
随机推荐
- csharp:SMO run sql script
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 伪类选择器 E:nth-child(n)、E:nth-of-type(n)
结构伪类是css3新增的类型选择器. E:nth-child(n).E:nth-of-type(n)就是其中之二.搞懂了这两个,基本上跟他俩一家的其他几个兄弟伙基本上也可以弄懂了. 首先先用文字语言来 ...
- BI怎么选?重点看这10个技术指标
2016年,商业智能市场火热,不管是投资圈还是IT圈,都在广泛关注着大数据和商业智能.宣传广告媒体报道见多了,不知道大家对BI选型的技术标准有谱了没.笔者对Gartner的BI魔力象限考评的15个关键 ...
- Quill编辑器IOS下无法获取焦点的解决方法
造成Quill-Editor无法获取焦点的大部分原因是Css的问题,罪魁祸首: *{ -webkit-user-select:none; } ios下直接造成无法获取焦点. 解决方法,覆盖以上css设 ...
- git批量修改已经提交的commit的姓名和邮箱
首先,我们创建change.sh脚本,并根据个人信息复制以下脚本. #!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="填写原来的邮箱 ...
- html 知识整理
一. 前言 本文全面介绍了html的定义.使用和具体常用标签. 参考资料:菜鸟教程 二.定义 html是HyperText Markup Language的简称,也就是超文本标记语言的缩写.通过htm ...
- 12-openldap使用AD密码
阅读视图 本文严重参考 Openldap 整合windows AD认证 本文其他参考 OpenLDAP使用AD密码 Configuring OpenLDAP pass-through authenti ...
- 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...
- OpenLdap 对接内部系统(Gitlab+Wiki+Jumpserver+Openvpn)配置
LDAP 全称轻量级目录访问协议(英文:Lightweight Directory Access Protocol),是一个运行在 TCP/IP 上的目录访问协议.目录是一个特殊的数据库,它的数据经常 ...
- 3.8Python数据处理篇之Numpy系列(八)---Numpy的梯度函数
目录 目录 前言 (一)函数说明 (二)一维数组的应用 (三)多维数组的应用 目录 前言 梯度函数,其中的梯度也就是斜率,反映的是各个数据的变化率.在numpy中只有一个梯度函数. (一)函数说明 ( ...