Android初级开发(四)——补充3、学习自定义控件

注:本文部分知识点参考了郭霖的《第一行代码》(第二版)

一、简单了解控件和布局的继承结构

我们所有的控件都是直接或间接继承自View,所有的布局都是直接或间接继承自ViewGroup的,如下图所示:

View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能相应这块区域的各种事件,因此,我们使用的各种控件其实就在在View的基础上又添加了各自特有的功能。而ViewGroup则是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个用于放置控件和布局的容器。

二、引入布局

在这里,我们做一个实例,就是常见的标题栏布局的引入。在一个应用中,有很多个活动都需要同样的一个标题栏,如果在每个活动的布局中都编写一遍同样的标题栏代码,机会导致大量的代码重复,也使我们的工作缺乏效率,这个时候我们就可以通过引入布局来解决这个问题。

新建一个布局title.xml(具体步骤为:在res目录下找到layout文件夹选中——右键——New——XML——Layout XML File),确定后出现下图界面:

第一行的Layout File Name是让我们输入布局名称,这里我们命名为title,第二行的Root Tag是选择我们的根布局,这里我们用Linearlayout。点击Finish,布局就创建完成了。

我们在布局里设置一个Button用于返回,一个TextView用于显示标题,一个Button用于编辑,代码如下:

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal">    <Buttonandroid:id="@+id/title_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="Back"android:textAllCaps="false"android:layout_margin="5dp"/>    <TextViewandroid:id="@+id/title_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center"android:gravity="center"android:text="Title Text"android:textSize="24sp"/>    <Buttonandroid:id="@+id/title_edit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="Edit"android:textAllCaps="false"android:layout_margin="5dp"/>LinearLayout>

其中Button的android:layout_margin指的是它在上下左右方向上的偏移距离。

标题布局编写完成了,接下来我们要做的就是在你想要添加标题的活动布局中引入标题布局。在这里,我在activity_main.xml中引入了标题布局,如下:

我们只用了一句include语句就已经将标题布局引入到了主Activity的布局文件中。还有一件事别忘啦,系统是自带有标题栏的,如果要显示我们自己加入的标题栏,就要做一些处理让系统自带标题栏隐藏掉。具体代码如下:

现在我们可以运行程序,来看一下效果:

三、创建自定义控件

在第二步中,我们很轻易的就实现了标题布局文件的引入,但是我们如果想要响应标题布局文件中的控件,就需要在主Activity中为这些控件单独编写一次事件注册的代码;如果有多个Activity引入了标题布局文件,我们就需要在各个Activity中为控件编写一次事件注册代码;然而,我们发现,标题栏中的返回按钮在各个Activity中的作用都是相同的,即销毁当前Activity,如果我们在每个Activity当中都写一遍销毁代码,就显得冗余和重复,所以这种情况最好是使用自定义控件的方式来解决。

我们新建一个TitleLayout布局,具体操作步骤为:在工程目录下找到Java文件夹——打开找到你自己的工程包——右键——New——JavaClass,如下图:

在Name中填入类名,这里我们新建的是TitleLayout类,点击OK,完成创建。

TitleLayout继承LinearLayout,完成继承后,你会发现代码下面出现了一条红线,将鼠标指针放在有红线的代码,点击Alt+Enter快捷键,然后点击提示的信息“Create constructor matching super”,接下来出现如下界面:

我们选择创建第二个方法,OK后,创建继承于LinearLayout类的自定义TitleLayout就完成了。接下来我们将title布局文件放入TitleLayout布局中,代码如下:

这时,主Activity中就不需要引入title.xml布局文件了,应引入TitleLayout布局,引入方式基本上是一样的,只不过在添加自定义控件的时候,要指明自定义控件的类名、包名,代码如下:

这个时候运行程序,出现的效果和第二步的是一样的。接下来我们要为标题栏中的控件添加自定义事件,修改TitleLayout中的代码,如下:

首先用findViewById()方法得到按钮的实例,然后分别调用setOnClickListener()方法给两个按钮注册点击事件,当点击返回按钮是销毁当前活动,当点击编辑按钮时,弹出一段文本,运行一下,效果如下:

这样的话,每当我们在一个布局中引入TitleLayout时,返回按钮和编辑按钮的点击事件就已经自动实现好了。

本文的例子和知识点结论大都引用到郭霖著作《第一行代码》(第二版),我觉得这本书还是很适合新手阅读的,例子很简单,讲解的也很清楚,安利一下~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容