原文链接:http://www.orlion.ga/441/

一、引入布局

iphone应用顶部会有一个标题栏,我们可以模仿着做一个,但是如果我们的程序中很多个活动都需要这样的标题栏,如果 每一个活动中都写一个标题栏就会导致代码重复,我们可以使用引入布局的方式来解决这个问题,新建一个布局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"><Buttonandroid:id="@+id/title_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="5dip"android:text="Back"android:textColor="#fff"/><TextView android:id="@+id/title_text"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:gravity="center"android:text="Title Text"android:textColor="#fff"android:textSize="24sp"/><Buttonandroid:id="@+id/title_edit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="5dip"android:text="Edit"android:textColor="#fff"/>
</LinearLayout>

android:layout_margin这个属性可以指定控件在上下左右方向上偏移的距离,当然也可以使用android:layout_marginLeft或 android:layout_marginTop等属性来单独指定控件在某个方向上偏移的距离。现在标题栏布局已经编写完成了,剩下的就是如何在程序中使用这个标题栏了,修改activity_main.xml中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><include layout="@layout/title"/></LinearLayout>

二、创建自定义控件

上边我们创建的标题栏有一个返回按钮,需要绑定事件。如果在每一个活动中都需要注册一遍返回按钮的点击事件会增加很多重复代码。这种情况最好使用自定义控件的方式解决

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

package com.example.uicustomviews;import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;public class TitleLayout extends LinearLayout {public TitleLayout(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title , this);}
}

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

现在自定义控件已经创建好了,然后我们需要在布局文件中添加这个自定义控件,修改activity_main.xml中的代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ga.orlion.uicustomviews.TitleLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content">   </ga.orlion.uicustomviews.TitleLayout></LinearLayout>

添加自定义控件和普通添加控件的方式基本上是一样的,只不过在添加自定义控件的时候我们需要指明控件的完整类名,包名在这里是不可以忽略的。

重新运行程序,可以看到效果与之前一样。

然后为标题栏中的按钮注册点击事件:

package com.example.uicustomviews;import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;public class TitleLayout extends LinearLayout {public TitleLayout(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title , this);Button titleBack = (Button) findViewById(R.id.title_back);Button titleEdit = (Button) findViewById(R.id.title_edit);titleBack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {((android.app.Activity) getContext()).finish();}});titleEdit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getContext() , "You clicked Edit button" , Toast.LENGTH_SHORT).show();}});}
}

Android入门(四)UI-创建自定义控件相关推荐

  1. Android入门(四)——页面跳转

    目录 一.如何创建多个页面 二.如何进行页面跳转 1.传递参数方式一 2.传递参数方式二(传递多个参数) 三.设置页面自动跳转(用到线程) 四.Activity生命周期 一.如何创建多个页面 一个ac ...

  2. Android 第八课 创建自定义控件

    常用控件和布局的继承结构,如下图: (待续....) 所有的控件都是直接或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的,View是Android中最基本的一种UI组件, ...

  3. Android开发系列之创建自定义控件

    Android开发过程中我们经常需要定义自己的控件,一方面基于复用的角度考虑,一方面也是基于逻辑处理思维的角度考虑.在这篇博客里面,笔者想要介绍.总结几种Android自定义控件的方法,如果有什么不对 ...

  4. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  5. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  6. Android中所有UI组件基类是,【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity...

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  7. Android入门篇(四):自动拨打电话、手动拨打电话

    Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...

  8. Android入门教程:ConstraintLayout约束布局

    原文首发自掘金芦苇APP团队,转载到自己小号上再发一遍~ 翻译By Leelion6.关于 ConstraintLayout 的文章其实已经不少了,不过看到这篇文章写的很有趣,以及在翻译的过程中,感受 ...

  9. Android初体验——UI

    文章目录 如何编写程序页面 常用控件的使用方法 TextView Button EditText ImageView ProgressBar AlertDialog ProgressDialog 详解 ...

  10. Android入门文档

    该文章为网络材料整理,部分内容经过重新编写. 一. 名词介绍 JDK:Java Development Kit Java 语言的软件开发工具包 JRE:Java Runtime Environment ...

最新文章

  1. 不雅测发挥分析Android在美智能机市场凌驾黑莓及苹果
  2. 超声波测距测速升压可调中周倒车雷达变频器传感器1:10
  3. Content-Type简要说明
  4. java层 android_Android开发实践:Java层与Jni层的数组传递
  5. html如何为“选择”框创建占位符?
  6. Steps And Uses Of Product Costing
  7. Java的GUI学习三(frame)
  8. php 检查txt中全角大写字母的个数
  9. MVVM框架的了解与使用
  10. 【Love2d从青铜到王者】第十二篇:Love2d之碰撞检测(Detecting collision)
  11. OSPF-LSA详解
  12. nginx+php部署环境
  13. 网络安全攻防之IPC$攻击
  14. 2023年金融节假日函数(VBA)
  15. Go语言中的uint和int的区别
  16. 投资理财学习笔记四,1.6那些必知的宏观经济指标(上)
  17. 算法作业2:分而治之 (持续更新)
  18. 财路网每日原创推送: 科普:区块链在其他领域的一些应用
  19. 稀疏表示和字典学习的简单理解
  20. 软考考c语言还是java,计算机程序设计工程师技术水平(java)证书就是计算机技术与软件专业技术资格考试的程序员证书么?...

热门文章

  1. UITextfiled 的属性注释简介
  2. 【转载】细说 ASP.NET Cache 及其高级用法
  3. vs2005 生成安装包的时候提示“不可恢复的生成错误”
  4. WinCE Display驱动开发介绍(转载)
  5. springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
  6. 【Java并发编程】3、DelayQueue应用场景,多考生考试
  7. !/usr/bin/env python和!/usr/bin/python的区别
  8. delphi 如何知道 Treeview,Listview 当前最上面显示的节点
  9. 【Objecitve C代码】让对象沿着某条路径移动的动画效果
  10. NetOps Defined