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>
执行结果例如以下:
单击button会有对应的事件响应。
注意,加入自己定义控件的时候须要指明完整的包名和类名
转载请注明:http://blog.csdn.net/j903829182/article/details/40682583
android学习七(创建自己定义控件)的更多相关文章
- React 创建自己定义控件
React是Facebook的内部项目,当时facebook对自己市面上全部的javascript MVC都不惬意,于是就自己创建了一个新的框架.发现还挺好用.于是就开源了,这就是React. Rea ...
- Android学习起步 - AutoCompleteTextView及MultiAutoCompleteTextView控件使用
大家在用百度搜索时,输入几个词就出现下拉框可选,以下两个控件就具有这个功能 AutoCompleteTextView:只能匹配输入的开始,只有一次匹配 MultiAutoCompleteTextVie ...
- 自己定义控件:onDraw 方法实现仿 iOS 的开关效果
概述 本文主要解说怎样在 Android 下实现高仿 iOS 的开关按钮,并不是是在 Android 自带的 ToggleButton 上改动,而是使用 API 提供的 onDraw.onMeasur ...
- 【Android】自己定义控件——仿天猫Indicator
今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的 ...
- Android自己定义控件:进度条的四种实现方式
前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...
- Android自己定义控件2-简单的写字板控件
概述 上一篇文章我们对自己定义控件进行了一个大体的知识介绍. 今天就来学习自己定义一个简单的写字板控件. 先来看看效果图 就是简单的依据手指写下的轨迹去画出内容 实现 在上一篇文章里提到了androi ...
- Android自己定义控件系列二:自己定义开关button(一)
这一次我们将会实现一个完整纯粹的自己定义控件,而不是像之前的组合控件一样.拿系统的控件来实现.计划分为三部分:自己定义控件的基本部分,自己定义控件的触摸事件的处理和自己定义控件的自己定义属性: 以下就 ...
- Android 自己定义控件开发入门(二)
上一次我们讲了一堆实现自己定义控件的理论基础.列举了View类一些能够重写的方法,我们对这些方法的重写是我们继承View类来派生自己定义控件的关键 我通过一个最简单的样例给大家展示了这一个过程,不管是 ...
- Android自己定义控件
今天我们来讲一下 Android中自己定义控件的介绍,在Android中, 我们一般写xml都是用的是单个的控件来完毕的 ,但是.往往在一些项目中.单个控件有时是满足不了的.故此我们能够自己定义控件 ...
随机推荐
- CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...
- Delphi xe7并行编程快速入门(三篇)
现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...
- 与众不同 windows phone (33) - Communication(通信)之源特定组播 SSM(Source Specific Multicast)
原文:与众不同 windows phone (33) - Communication(通信)之源特定组播 SSM(Source Specific Multicast) [索引页][源码下载] 与众不同 ...
- [Android学习笔记]Android中多线程开发的一些概念
线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ...
- linux-sfdisk 使用方法
功能说明:硬盘分区工具程序. 语 法:sfdisk [-?Tvx][-d <硬盘>][-g <硬盘>][-l <硬盘>][-s <分区>][-V < ...
- 最想做的三个Delphi项目:Paint,IM,SQL,另外还有Smart,TMS,FMX,UML,FreePascal,Python4Delphi,Cheat Engine
都是绝美项目- 如果有时间,要做的项目:0. 整整5个Cloud项目(可带来商业收益,其中还包括手机发送, S/D/N/L/NetDriver)1. Heidi/front/SQLITE STUDIO ...
- c 可变参数 定义可变参数的函数
定义可变参数的函数,需要在stdarg.h头文件中定义的va_list类型和va_start.va_arg.va_end三个宏. 定义可变参数函数 va_list ap; //实际是定义一个指针va ...
- js技术要点---JS 获取网页源代码
JS 获取网页源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html& ...
- 三框架:使用数据源dbcp注意
使用spring整合hibernate时间,需要使用该数据源,数据源使用apache的dbcp,使用dbcp当需要依靠pool的jar包.选择dbcp和pool当你需要注意. DBCP 2 compi ...
- vim在编译器 . 命令(点命令)
时间:2014.06.28 地点:基地 -------------------------------------------------------------------------------- ...