Android 学习到一点程度,想继续深造学习就必然会开始接触自定义控件,自定义控件可以分成3种类型,可以说是3个难度,最简单的是组合控件,其次是继承View 自定义控件,最为复杂的是继承ViewGroup的自定义控件,今天我们就重最简单的自定义组合控件开始学习。

自定义组合控件可以分成3个步骤,

第一步 选择继承哪个空间 View 还是 ViewGroup ;

第二步  重写3个构成方法,在valus 目录下创建attrs 声明一些根据业务需求的属性

第三步  显示

需要注意:自定义控件需要应用命名空间和完整包名,具体看以下代码

第一步 : 继承了LinearLayout

package com.example.CombinationView;

import android.annotation.TargetApi;

import android.content.Context;

import android.content.res.TypedArray;

import android.os.Build;

import android.util.AttributeSet;

import android.view.View;

import android.widget.LinearLayout;

/**

* Created by ADMIN on 2015/9/30.

*/

public class TopView extends LinearLayout {

int defaultViewType = 0;//默认的组合view

boolean left, right, section;

View leftView, rightView, sectionView;

public TopView(Context context) {

this(context, null);

}

// 对XML 的解析

public TopView(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray array = context.obtainStyledAttributes(attrs,

R.styleable.Top);

defaultViewType = array.getInteger(R.styleable.Top_viewtype, 0);

left = array.getBoolean(R.styleable.Top_left, true);

right = array.getBoolean(R.styleable.Top_right, true);

section = array.getBoolean(R.styleable.Top_section, true);

array.recycle();

//

initView(context);

}

// 根据不同XML标记 更换不同的View

private void initView(Context context) {

View Viewtop;

switch (defaultViewType){

case 0:

Viewtop = TopView.inflate(context, R.layout.tob_view, this);

initChildrenView(Viewtop);

break;

case 1:

Viewtop = TopView.inflate(context, R.layout.tob_viewtwo, this);

initChildrenView(Viewtop);

break;

}

}

private void initChildrenView(View viewtop) {

leftView = viewtop.findViewById(R.id.left);

rightView =viewtop.findViewById(R.id.right);

sectionView = viewtop.findViewById(R.id.section);

leftView.setVisibility(left ? VISIBLE : GONE);

rightView.setVisibility(right ? VISIBLE : GONE);

sectionView.setVisibility(section ? VISIBLE : GONE);

}

/**

* 左边点击事件监听

* @param onClickListener

*/

public void LeftViewClick(OnClickListener onClickListener){

leftView.setOnClickListener(onClickListener);

}

/**

* 右边点击事件监听

* @param onClickListener

*/

public void RigthViewClick(OnClickListener onClickListener){

rightView.setOnClickListener(onClickListener);

}

public View getSectionView() {

return sectionView;

}

public View getLeftView() {

return leftView;

}

public View getRightView() {

return rightView;

}

/**

* 对自定义内部的点解事件进行全部监听传递到到外面Actity

对外包提供事件处理的方法

* @param onClickListener

*/

public void TopClick(OnClickListener onClickListener){

LeftViewClick(onClickListener);

RigthViewClick(onClickListener);

}

}

===================================================================

valus 目录下创建attrs 声明一些根据业务需求的属性

===============================================

在布局文件中引用组合控件

需要注意的是

http://schemas.android.com/apk/res/ + package包名

xmlns:top="http://schemas.android.com/apk/res/com.example.CombinationView"

=========================================

xmlns:top="http://schemas.android.com/apk/res/com.example.CombinationView"

xmlns:top="http://schemas.android.com/apk/res/com.example.CombinationView"

android:orientation="vertical"

android:background="#FFFFFF"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:id="@+id/topview"

top:left="true"

top:viewtype="0"

android:layout_width="match_parent"

android:layout_height="60dp"/>

========================================================================

在主activity 中 处理组合控件的每个点击事件

package com.example.CombinationView;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

public class MyActivity extends Activity {

/**

* Called when the activity is first created.

*/

TopView topView;

View left;

View Right;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

topView = (TopView) findViewById(R.id.topview);

left = topView.getLeftView();

Right = topView.getRightView();

topView.TopClick(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(v ==left){

System.out.println("点击了左边");

}else if(v==Right){

System.out.println("点解了==Right");

}

}

});

}

}

OK 完美收官,就这样完成一个自定义组合控件, 不懂请留言

android 原理 组合控件_Android自定义控件之组合控件相关推荐

  1. java 用户控件_C#自定义控件VS用户控件

    C#中自定义控件VS用户控件大比拼 1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Co ...

  2. android 原理 组合控件_Android自定义控件进阶01-自定义控件开发套路与流程

    Android自定义控件进阶01-自定义控件开发套路与流程本章节为什么要叫进阶篇?(虽然讲的是基础内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学 ...

  3. android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView

    手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器,前几天用手机刷了MIUI,发现自带的那个时间选择器效果挺好看的,于是就自己仿写了一个,权当练手.先来看效果: 效果还行吧?实现思路就是自定 ...

  4. C#自定义控件VS用户控件

    C#自定义控件VS用户控件 1.C#中自定义控件VS用户控件大比拼 2.为自定义控件(或类)的方法属性添加注解 2.1.Description:在属性窗口中添加属性及属性说明 2.2.Browsabl ...

  5. Android开发技巧——自定义控件之组合控件

    Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...

  6. 腾讯Android自动化测试实战3.1.4 Robotium的控件获取、操作及断言

    3.1.4 Robotium的控件获取.操作及断言 Robotium是一款在Android客户端中的自动化测试框架,它需要模拟用户操作手机屏幕.要完成对手机的模拟操作,应该包含以下几个基本操作: (1 ...

  7. 自定义控件之——封装控件(一)

    自定义属性与自定义Style 在使用一个自定义控件式我们常常在它的xml文件中看到如下的代码: <com.example.administrator.tine.view.CustomCalend ...

  8. Android自定义View精品(CustomCalendar-定制日历控件)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1.分析 2.自定义属性 3.onMeasure() 4.onDraw() ①.绘制月份 ...

  9. 《深入理解Android 卷III》第六章 深入理解控件(ViewRoot)系统

    <深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...

  10. Android获取景点的信息,景点介绍(ListView控件应用)

    1. 案例概述 此案例主要是对ListView列表控件的使用.当应用中包含多项数据,每项数据结构相同,只是内容不同时,可通过列表显示.对于列表中的内容,可以是显示字符串的TextView,也可以是结构 ...

最新文章

  1. Java数组合并,完成排序,从时间复杂度,和空间复杂度考虑
  2. OpenCV学习笔记之改变图像的对比度和亮度
  3. kubernetes目录挂载
  4. Web高并发访问:用HAPorxy实现负载均衡
  5. 一个神奇的测试_这4个在线黑科技工具拥有神奇的魔法,值得收藏!
  6. 浅谈python MRO与Mixin模式
  7. 一般左边后台点击收缩展开的效果
  8. 易语言mysql清空一个表_易语言高级表格清空.doc
  9. MOOC 浙江大学C语言翁恺(第一、二章 满分答案)
  10. imagenet2012 对应 label
  11. 金山陈飞舟:《剑网3》3D引擎重生记
  12. 【tensorflow 训练验证数据处理】制制作trian和val TXT的文件
  13. 百度云网盘资源高速下载免登录网页版教程分享
  14. 盘点2019年PHP高级开发工程师面试题及答案汇总
  15. hexo 修改index.html,hexo--新建页面、修改主页
  16. Quake1和2的pak资源文件格式说明
  17. python编写hello程序_python第一个程序“Hello, world”
  18. Button与ImageButton
  19. 拼多多怎么通过流量提高排名|成都盛天海
  20. Python软件编程等级考试二级——20200614A

热门文章

  1. 程序中使用log4J打印信息的两种方式
  2. Java程序员们最常犯的10个错误
  3. javascript 模板
  4. 鼠标移上去切换背景色
  5. 创建型模式专题总结:Creational Pattern(转自Terrylee)
  6. ubuntu下C语言编程的注意点
  7. Radar altimeters and laser altimeters
  8. ArcGIS运行任务前台显示
  9. 利用ArcGIS Pro进行时空数据挖掘和可视化呈现
  10. Python实现WGS 84坐标与web墨卡托投影坐标的转换