android 原理 组合控件_Android自定义控件之组合控件
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自定义控件之组合控件相关推荐
- java 用户控件_C#自定义控件VS用户控件
C#中自定义控件VS用户控件大比拼 1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Co ...
- android 原理 组合控件_Android自定义控件进阶01-自定义控件开发套路与流程
Android自定义控件进阶01-自定义控件开发套路与流程本章节为什么要叫进阶篇?(虽然讲的是基础内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学 ...
- android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView
手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器,前几天用手机刷了MIUI,发现自带的那个时间选择器效果挺好看的,于是就自己仿写了一个,权当练手.先来看效果: 效果还行吧?实现思路就是自定 ...
- C#自定义控件VS用户控件
C#自定义控件VS用户控件 1.C#中自定义控件VS用户控件大比拼 2.为自定义控件(或类)的方法属性添加注解 2.1.Description:在属性窗口中添加属性及属性说明 2.2.Browsabl ...
- Android开发技巧——自定义控件之组合控件
Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...
- 腾讯Android自动化测试实战3.1.4 Robotium的控件获取、操作及断言
3.1.4 Robotium的控件获取.操作及断言 Robotium是一款在Android客户端中的自动化测试框架,它需要模拟用户操作手机屏幕.要完成对手机的模拟操作,应该包含以下几个基本操作: (1 ...
- 自定义控件之——封装控件(一)
自定义属性与自定义Style 在使用一个自定义控件式我们常常在它的xml文件中看到如下的代码: <com.example.administrator.tine.view.CustomCalend ...
- Android自定义View精品(CustomCalendar-定制日历控件)
版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1.分析 2.自定义属性 3.onMeasure() 4.onDraw() ①.绘制月份 ...
- 《深入理解Android 卷III》第六章 深入理解控件(ViewRoot)系统
<深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...
- Android获取景点的信息,景点介绍(ListView控件应用)
1. 案例概述 此案例主要是对ListView列表控件的使用.当应用中包含多项数据,每项数据结构相同,只是内容不同时,可通过列表显示.对于列表中的内容,可以是显示字符串的TextView,也可以是结构 ...
最新文章
- Java数组合并,完成排序,从时间复杂度,和空间复杂度考虑
- OpenCV学习笔记之改变图像的对比度和亮度
- kubernetes目录挂载
- Web高并发访问:用HAPorxy实现负载均衡
- 一个神奇的测试_这4个在线黑科技工具拥有神奇的魔法,值得收藏!
- 浅谈python MRO与Mixin模式
- 一般左边后台点击收缩展开的效果
- 易语言mysql清空一个表_易语言高级表格清空.doc
- MOOC 浙江大学C语言翁恺(第一、二章 满分答案)
- imagenet2012 对应 label
- 金山陈飞舟:《剑网3》3D引擎重生记
- 【tensorflow 训练验证数据处理】制制作trian和val TXT的文件
- 百度云网盘资源高速下载免登录网页版教程分享
- 盘点2019年PHP高级开发工程师面试题及答案汇总
- hexo 修改index.html,hexo--新建页面、修改主页
- Quake1和2的pak资源文件格式说明
- python编写hello程序_python第一个程序“Hello, world”
- Button与ImageButton
- 拼多多怎么通过流量提高排名|成都盛天海
- Python软件编程等级考试二级——20200614A