(转)android自定义组合控件
原文地址:http://mypyg.iteye.com/blog/968646
目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性。
1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- android:gravity="center_vertical">
- <TextView android:layout_height="wrap_content" android:id="@+id/text1"
- android:layout_width="wrap_content"></TextView>
- <ImageButton android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:id="@+id/btn1"></ImageButton>
- </LinearLayout>
2.自定义控件代码,从LinearLayout继承:
- public class ImageBtnWithText extends LinearLayout {
- public ImageBtnWithText(Context context) {
- this(context, null);
- }
- public ImageBtnWithText(Context context, AttributeSet attrs) {
- super(context, attrs);
- LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true);
- }
- }
在构造函数中将Xml中定义的布局解析出来。
PS:有时执行此句代码时eclipse会输出找不到资源,而无法预览自定义控件。经试验确定是新增的布局没有生成资源,但是clean project重新生成也不行,最后重启eclipse解决。
3.在主界面布局xml中使用自定义控件:
- <com.demo.widget2.ImageBtnWithText
- android:id="@+id/widget"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
即使用完整的自定义控件类路径:com.demo.widget2.ImageBtnWithText定义一个元素。
运行可以看到控件已经能够被加载到界面上。
4.给按钮设置图片和文本
如果图片是固定不变的,那么直接在控件布局中设置ImageButton的src属性即可。
4.1通过Java代码设置,在控件代码中提供函数接口:
- public void setButtonImageResource(int resId) {
- mBtn.setImageResource(resId);
- }
- public void setTextViewText(String text) {
- mTv.setText(text);
- }
然后再在主界面的onCreate()通过函数调用设置即可。
4.2通过Xml设置属性
4.2.1首先定义Xml可以设置的属性集合,在values下创建attrs.xml,文件名可随意,一般都叫attrs.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="ImageBtnWithText">
- <attr name="android:text"/>
- <attr name="android:src"/>
- </declare-styleable>
- </resources
属性集合名字:ImageBtnWithText,自己可根据实际来定义;
集合中包含的属性列表,每行一个属性。
4.2.2修改自定义控件实现代码,以获取xml中定义的属性
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);
- CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);
- if(text != null) mTv.setText(text);
- Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);
- if(drawable != null) mBtn.setImageDrawable(drawable);
- a.recycle()
首先通过context.obtainStyledAttributes获得所有属性数组;
然后通过TypedArray类的getXXXX()系列接口获得相应的值。
4.2.3在主界面布局中设置自定义控件的属
android:text="ABC" android:src="@drawable/icon
4.3自定义名称属性:
在4.2中使用的属性名是android系统命名空间的,都以android开头,比如android:text等。
实际开发中会自定义一些属性名,这些属性名仍然定义在4.2.1提到的attrs.xml中:
4.3.1定义属性名
- <attr name="appendText" format="string"/>
和直接使用系统的attr不同的是要增加一个format属性,说明此属性是什么格式的。format可选项可参见注1
4.3.2使用自定义属性
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <com.demo.widget2.ImageBtnWithText
- android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"
- android:layout_width="fill_parent" android:layout_gravity="center"
- android:layout_height="fill_parent" myspace:appendText="123456">
- </com.demo.widget2.ImageBtnWithText>
- </LinearLayout>
直接在主布局文件中使用此属性appendText="abc"是不会设置生效的,而是要在主布局xml中定义一个xml命名空间:
xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"
命名空间的名字可以自己随便定义,此处为myspace,即xmlns:myspace;
后面的地址则有限制,其开始必须为:"http://schemas.android.com/apk/res/",后面则是包名com.demo.customwidget,
此处的包名与AndroidManifest.xml中<manifest>节点的属性package="com.demo.customwidget"一致,不是自定义控件Java代码所在的包,当然简单的程序自定义控件Java代码也一般在此包内。
注1:
注1:format可选项
"reference" //引用
"color" //颜色
"boolean" //布尔值
"dimension" //尺寸值
"float" //浮点值
"integer" //整型值
"string" //字符串
"fraction" //百分数,比如200%
枚举值,格式如下:
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
xml中使用时:
android:orientation = "vertical"
标志位,位或运算,格式如下:
<attr name="windowSoftInputMode">
<flag name = "stateUnspecified" value = "0" />
<flag name = "stateUnchanged" value = "1" />
<flag name = "stateHidden" value = "2" />
<flag name = "stateAlwaysHidden" value = "3" />
<flag name = "stateVisible" value = "4" />
<flag name = "stateAlwaysVisible" value = "5" />
<flag name = "adjustUnspecified" value = "0x00" />
<flag name = "adjustResize" value = "0x10" />
<flag name = "adjustPan" value = "0x20" />
<flag name = "adjustNothing" value = "0x30" />
</attr>
xml中使用时:
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
另外属性定义时可以指定多种类型值,比如:
<attr name = "background" format = "reference|color" />
xml中使用时:
android:background = "@drawable/图片ID|#00FF00"
(转)android自定义组合控件的更多相关文章
- Android自定义组合控件详细示例 (附完整源码)
在我们平时的Android开发中,有时候原生的控件无法满足我们的需求,或者经常用到几个控件组合在一起来使用.这个时候,我们就可以根据自己的需求创建自定义的控件了,一般通过继承View或其子类来实现. ...
- 014 Android 自定义组合控件
1.需求介绍 将已经编写好的布局文件,抽取到一个类中去做管理,下次还需要使用类似布局时,直接使用该组合控件的对象. 优点:可复用. 例如要重复利用以下布局: <RelativeLayout an ...
- Android自定义组合控件
今天和大家分享下组合控件的使用.很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便 ...
- Android自定义组合控件内子控件无法显示问题
今天自定义了一个组合控件,与到了个奇葩问题: 我自定义了一个RelativeLayout,这个layout内有多个子控件.但奇怪的是这些子控件一直显示不出来.调试了一下午,竟然是因为在获取(infla ...
- android 自定义组合控件 顶部导航栏
在软件开发过程中,经常见到,就是APP 的标题栏样式几乎都是一样的,只是文字不同而已,两边图标不同.为了减少重复代码,提高效率, 方便大家使用,我们把标题栏通过组合的方式定义成一个控件. 例下图: 点 ...
- Android自定义组合控件:UIScrollLayout(支持界面滑动及左右菜单滑动)
一.前言: 我之前很早的时候,写过一篇<左右滑出菜单>的文章: http://blog.csdn.net/qingye_love/article/details/8776650 用的是对V ...
- Android 自定义组合控件
1, you need to add this kind of code to the constructors of your custom view which must extend ViewG ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- Android 手机卫士--自定义组合控件构件布局结构
由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...
随机推荐
- webService获取电话号归属地和获取天气情况步骤,及创建属于自己的webservice
一.什么是Web服务 Web服务是一种可以用来解决跨网络应用集成问题的开发模式,目的是保证不同平台的应用服务可以互操作 二.Web服务的三个核心 Soap: SOAP(Simple Object Ac ...
- 简单的angular购物车商品小计
<!DOCTYPE html> <html lang="en" ng-app="shopApp"> <head> <m ...
- Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- webapi相关知识
1.从uri中获取参数 :后端:[FromUri] 2.从uri中获取数组参数:后端:[FromUri]string[] type 前端:type[]=1&type[]=2&type ...
- 学习C++.Primer.Plus 10 对象和类
1.类的声明和定义 类的声明和定义. 类声明的格式如下: class className { private://private 是类对象的默认访问控制,因此,可以省略 data member del ...
- haproxy 新手上路
apache.nginx之类的反向代理(转发)功能,通常只能用于http协议,其它协议就不好使了(注:nginx据说商业版的,支持tcp协议了). haproxy可以弥补这方面的不足,haproxy支 ...
- JavaScript中的this陷阱的最全收集 没有之一
当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概 念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解 ...
- JQuery中each()的使用方法说明
JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...
- 怎样让 Web 项目暴露在外的服务坚不可摧?
Web 项目一般给特定人群使用,有些是局域网用户量不足1K的内部系统,也有些广域网用户上万的中型项目,当然还有用户上亿的大型项目. 这些大大小小的 Web 项目都会有用户登录的存在,登录后有特定的权限 ...
- 状态栏消息提示——使用Notification
什么是Notification Notification用于在状态栏显示信息.这些信息一般来源于app的消息推送,或应用的一些功能控制(如播放器) Notification的两种视图 普通视图 借用官 ...