android学习七(创建自定义控件)

前面学习的是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>

运行结果如下:

单击按钮会有相应的事件响应。

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

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

时间: 2024-10-17 06:51:02

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

Android学习七:new Date使用

1.例子 学习时间函数,并实现了简单的多个按钮监听同一个事件的方法 2.代码 代码很简单,也很清晰 package com.example.datetime; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.view.Menu;

Android学习七---Hello OpenCV samples

创建一个能够使用OpenCV JavaCameraView的应用程序来了解基于OpenCV java API 的应用程序的开发流程.有了Android的基础,在程序中需要修改的几个地方1.activity_main.xml 2.AndroidManifest.xml 3.MainActivity.java 一.创建项目 安装创建android程序的方式创建一个blank activity,项目名称为hellosamples,其他采用默认的activity_main.xml,MainActivit

android学习三---创建第一个程序

1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所需最低的SDK版本,目标版本和编译版本,next next 选择一个Activity,默认是blank.然后Finish. 就创建好一个android项目了.不需要添加任何代码,就可以运行了. 2.创建虚拟机和在真机上运行 2.1 模拟器运行 打开工具栏上AVD的按钮 出现创建VD(虚拟机)的界面

Android学习之创建新项目

新建项目test01 File->New->Android Application Project 在Application name:输入应用程序名test01 在Project name:输入工程名test01 在package name:输入包的名字com.bjsxt.test01 Minimum Required SDK:API8 一路下一步,中间步可设置图标等详细内容 这里IDE环境已经为我们写了一些基本的代码了: package com.bjsxt.test01; import a

Django学习(七) 创建第一个Django项目

如果这是你第一次使用Django,你必须进行一些初始设置.即,您将需要自动生成一些代码,建立了Django项目. 从命令行.cd进入一个目录,你想要存储您的代码,然后运行以下命令: django-admin startproject mysite 这样就会在当前目录下创建一个为mysite的目录.在这个创建的mysite文件夹中默认包含了一些文件,文件结构目录如下: mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py

android学习七 菜单

1.菜单分类 常规菜单 子菜单 上下文菜单 图标菜单 辅助菜单 交替菜单 2.菜单类 andriod.view.menu 3.菜单的参数 名称:字符串标题 菜单ID:整数 组ID:表示该项是哪一组中的(组相关函数 removGroup(id) setGroupCheckable(id,checkable,exclusive)  setGroupEnabled(id,boolean,enabled)  setGroupVisible(id,visible) ) 排序:指定该菜单项在菜单中顺序的整数

Android学习笔记——创建一个简单的上下文菜单ContextMenu

例子目标: 在一个显示出来的内容区域内,触摸屏幕显示一个上下文菜单,并且实现监听,当选择菜单项的时候,获得用户选择的项的内容. 实现原理: 1.向内容Activity中的需要显示上下文菜单的内容区域注册上下文菜单响应 2.设计上下文菜单样式 3.在Activity中实现上下文菜单的方法 代码: 上下文菜单的XML内容 <?xml version="1.0" encoding="utf-8"?><menu xmlns:android="ht

Andriod - 创建自定义控件

控件和布局的继承结构: 可以看到,我们所用的所有控件都是直接或间接继承自 View的,所用的所有布局都是直接或间接继承自 ViewGroup 的.View 是 Android 中一种最基本的 UI 组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在 View的基础之上又添加了各自特有的功能.而 ViewGroup 则是一种特殊的 View,它可以包含很多的子 View 和子 ViewGroup,是一个用于放置控件和布局的容器.这个时候我们就可以思

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用