前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局。我们来看下各种控件和布局的关系。

可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接或者间接基础自ViewGroup的。View是Android中一种最主要的UI组件,它能够在屏幕的上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件事实上就是在View的基础上又加入了各种各自特有的功能。而ViewGroup则是一种特殊的View,它能够包括非常多的View和子ViewGroup,是一个用于放置控件和布局的容器。创建自己定义控件的两种简单的方法,一种是引入布局,还有一种是自己定义控件。

首先创建一个项目,项目的名字为UICustomViews。

以下我们就自定义一个标题栏。

新建一个布局,代码例如以下:

<?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:orientation="horizontal"
android:background="@drawable/title_bg" > <Button
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dip"
android:background="@drawable/back_bg"
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"
/> <Button
android:id="@+id/title_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dip"
android:background="@drawable/edit_bg"
android:text="Edit"
android:textColor="#fff"
/> </LinearLayout>

改动主布局,代码例如以下:

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

改动MainActivity里面的onCreate方法

代码例如以下:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); }

<include layout="@layout/title"/>是引入一个布局文件

requestWindowFeature(Window.FEATURE_NO_TITLE);是将系统自带的标题栏隐藏掉

程序执行结果例如以下:

使用上面的这样的引入布局的方式,无论有多少布局须要加入标题栏,仅仅需一行include语句就能够了。

引入布局的技巧确实攻克了反复编写代码的问题,可是假设布局中有一些控件要求能响应事件,我们还是须要在每一个活动中为这些控件单独的编写一次事件注冊的代码。可是注冊的代码都一样,所以这会带来非常多反复的代码,那么以下就进行自己定义控件。

自己定义控件

新建TitleLayout继承LinearLayout,代码和说明例如以下:

package com.wj.uicustomviews;

import android.app.Activity;
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);
// TODO Auto-generated constructor stub
/*
* 重写LinearLayout中的带有2个參数的构造函数,在布局中引入TitleLayout控件就会调用这个构造函数
* 然后在构造函数中须要对标题栏布局进行动态载入,这就是要借助LayoutInflater来实现了。通过LayoutInflater的
* from()方法能够构建出一个LayoutInflater对象,然后调用inflate()方法就能够动态载入一个布局文件,inflate方法
* 接收2个參数数,第一个參数是要载入的布局的id,这里我们传入R.layout.title,第二个參数是给载入好的布局在加入一个父布局,
* 这里我们想要指定为TitleLayout,于是就传入this
*
* */
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 OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
((Activity)getContext()).finish();
} }); titleEdit.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getContext(), "you clicked edit button",
Toast.LENGTH_SHORT).show();
} }); } }

在布局文件里引用自己定义控件改动主布局文件,代码例如以下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <!-- <include layout="@layout/title"/> -->
<com.wj.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
> </com.wj.uicustomviews.TitleLayout> </LinearLayout>

执行结果例如以下:

单击button会有对应的事件响应。

注意,加入自己定义控件的时候须要指明完整的包名和类名

转载请注明:http://blog.csdn.net/j903829182/article/details/40682583

android学习七(创建自己定义控件)的更多相关文章

  1. React 创建自己定义控件

    React是Facebook的内部项目,当时facebook对自己市面上全部的javascript MVC都不惬意,于是就自己创建了一个新的框架.发现还挺好用.于是就开源了,这就是React. Rea ...

  2. Android学习起步 - AutoCompleteTextView及MultiAutoCompleteTextView控件使用

    大家在用百度搜索时,输入几个词就出现下拉框可选,以下两个控件就具有这个功能 AutoCompleteTextView:只能匹配输入的开始,只有一次匹配 MultiAutoCompleteTextVie ...

  3. 自己定义控件:onDraw 方法实现仿 iOS 的开关效果

    概述 本文主要解说怎样在 Android 下实现高仿 iOS 的开关按钮,并不是是在 Android 自带的 ToggleButton 上改动,而是使用 API 提供的 onDraw.onMeasur ...

  4. 【Android】自己定义控件——仿天猫Indicator

    今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的 ...

  5. Android自己定义控件:进度条的四种实现方式

    前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...

  6. Android自己定义控件2-简单的写字板控件

    概述 上一篇文章我们对自己定义控件进行了一个大体的知识介绍. 今天就来学习自己定义一个简单的写字板控件. 先来看看效果图 就是简单的依据手指写下的轨迹去画出内容 实现 在上一篇文章里提到了androi ...

  7. Android自己定义控件系列二:自己定义开关button(一)

    这一次我们将会实现一个完整纯粹的自己定义控件,而不是像之前的组合控件一样.拿系统的控件来实现.计划分为三部分:自己定义控件的基本部分,自己定义控件的触摸事件的处理和自己定义控件的自己定义属性: 以下就 ...

  8. Android 自己定义控件开发入门(二)

    上一次我们讲了一堆实现自己定义控件的理论基础.列举了View类一些能够重写的方法,我们对这些方法的重写是我们继承View类来派生自己定义控件的关键 我通过一个最简单的样例给大家展示了这一个过程,不管是 ...

  9. Android自己定义控件

    今天我们来讲一下 Android中自己定义控件的介绍,在Android中, 我们一般写xml都是用的是单个的控件来完毕的 ,但是.往往在一些项目中.单个控件有时是满足不了的.故此我们能够自己定义控件 ...

随机推荐

  1. java jquery 函数多參数传递

    业务需求: 名次   伙伴 业绩 签单 面谈 每日目标 1 文彬 5100 6 10 查看目标 2 马红月 4550 4 6 查看目标 3 王刚 4100 3 9 查看目标 4 郭亚凯 3450 4 ...

  2. java Date 和 javascript Date

    近期写一个页面.上面要展示下日期. 在Java中生成了Date.然后将这个Date通过velocity送入vm模板其中 代码例如以下: var dates = new Date("$!{pp ...

  3. 浅析Delphi Container库(有开源的DCLX)

    与Java和C++相比,Delphi对容器的支持实在少得可怜.Java有强大的集合框架,C++更有STL,Delphi有什么呢,不就是TList几个小巧的列表类,而TCollection系列的类更多只 ...

  4. blender资源

    blender资源 只能发帖不能更改的百度贴吧贴. http://tieba.baidu.com/f?kw=blender blendercn youku视频专辑: http://i.youku.co ...

  5. POJ 1562 Oil Deposits

    转载请注明出处:http://blog.csdn.net/a1dark 大规模的图论切题之旅正式开始了.由于今天停了一天的电.所以晚上才开始切题.直到昨晚才把图论大概看了一遍.虽然网络流部分还是不怎么 ...

  6. WinCE隐藏显示任务栏,当任务栏隐藏时将其显示,当任务栏显示时将其隐藏(FindWindow,ShowWindow,IsWindowVisible),

    HANDLE hWndTaskBar = ::FindWindow(TEXT("HHTaskBar"), NULL);  if(::IsWindowVisible(hWndTask ...

  7. python语言学习9——使用list和tuple

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 位置 用索引来访问list中每一个位置的元素,记得索引是从0开始的,到 len-1结 ...

  8. 调用WCF的异步方法

    原文:调用WCF的异步方法 AsyncCallback aLoginCallback = delegate(IAsyncResult result) { var aSystemUser = WcfCl ...

  9. 13.怎样自学Struts2之Struts2本地化[视频]

    13.怎样自学Struts2之Struts2本地化[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了,仅仅好传到百度云上: http://pan ...

  10. 【DRP】删除递归树的操作

    正如图呈现的树结构.本文从任意节点删除树形结构.提供解决方案 图中,不包括其他结点的是叶子结点.包括其他结点的是父结点,即不是叶子结点. 一 本文的知识点: (1)递归调用: 由于待删除的结点的层次是 ...