当前位置: 首页 > news >正文

Android自定义组合控件

为什么80%的码农都做不了架构师?>>>   hot3.png

目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性。 
1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton。  
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     android:gravity="center_vertical">  
  5.     <TextView android:layout_height="wrap_content" android:id="@+id/text1"  
  6.         android:layout_width="wrap_content"></TextView>  
  7.     <ImageButton android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content" android:id="@+id/btn1"></ImageButton>  
  9. </LinearLayout>  

2.自定义控件代码,从LinearLayout继承:  
Java代码   收藏代码
  1. public class ImageBtnWithText extends LinearLayout {  
  2.   
  3.     public ImageBtnWithText(Context context) {  
  4.         this(context, null);  
  5.     }  
  6.       
  7.     public ImageBtnWithText(Context context, AttributeSet attrs) {  
  8.         super(context, attrs);  
  9.         LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, thistrue);  
  10.         }  
  11. }  

在构造函数中将Xml中定义的布局解析出来。 
PS:有时执行此句代码时eclipse会输出找不到资源,而无法预览自定义控件。经试验确定是新增的布局没有生成资源,但是clean project重新生成也不行,最后重启eclipse解决。 
3.在主界面布局xml中使用自定义控件:  
Xml代码   收藏代码
  1. <com.demo.widget2.ImageBtnWithText  
  2.         android:id="@+id/widget"  
  3.         android:layout_width="fill_parent"   
  4.         android:layout_height="fill_parent" />  

即使用完整的自定义控件类路径:com.demo.widget2.ImageBtnWithText定义一个元素。 
运行可以看到控件已经能够被加载到界面上。 
4.给按钮设置图片和文本  
如果图片是固定不变的,那么直接在控件布局中设置ImageButton的src属性即可。 
4.1通过Java代码设置,在控件代码中提供函数接口:  
Java代码   收藏代码
  1. public void setButtonImageResource(int resId) {  
  2.         mBtn.setImageResource(resId);  
  3.     }  
  4.       
  5.     public void setTextViewText(String text) {  
  6.         mTv.setText(text);  
  7.     }  

然后再在主界面的onCreate()通过函数调用设置即可。 
4.2通过Xml设置属性  
4.2.1首先定义Xml可以设置的属性集合,在values下创建attrs.xml,文件名可随意,一般都叫attrs.xml  
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="ImageBtnWithText">  
  4.         <attr name="android:text"/>  
  5.         <attr name="android:src"/>  
  6.     </declare-styleable>  
  7. </resources  

属性集合名字:ImageBtnWithText,自己可根据实际来定义; 
集合中包含的属性列表,每行一个属性。 
4.2.2修改自定义控件实现代码,以获取xml中定义的属性  
Java代码   收藏代码
  1. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);  
  2. CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);  
  3. if(text != null) mTv.setText(text);  
  4. Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);  
  5. if(drawable != null) mBtn.setImageDrawable(drawable);  
  6. 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定义属性名  
Xml代码   收藏代码
  1. <attr name="appendText" format="string"/>  

和直接使用系统的attr不同的是要增加一个format属性,说明此属性是什么格式的。format可选项可参见注1 
4.3.2使用自定义属性  
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"  
  4.     android:orientation="vertical" android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent">  
  6.     <com.demo.widget2.ImageBtnWithText  
  7.         android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"  
  8.         android:layout_width="fill_parent" android:layout_gravity="center"  
  9.         android:layout_height="fill_parent" myspace:appendText="123456">  
  10.     </com.demo.widget2.ImageBtnWithText>  
  11. </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" 

转载于:https://my.oschina.net/ljhUncle/blog/139434

相关文章:

  • js判断客户浏览器类型,版本
  • Eclipse Deepin 12.12 代码提示崩溃
  • 做技术到底可以做到哪种地步-技术为什么越走越窄
  • linux转发流程图。
  • Java连接Mysql,SQL Server, Access,Oracle
  • 毕业那点事儿--回顾在大学这7年
  • Engineer01
  • 7款拥有超酷设计灵感的动态网站设计
  • 这才叫电脑高手!
  • 必应搜索全球PK,只为证明自己
  • 关于glusterfs-3.3.1的两个bug
  • 老树新芽,在ES6下使用Express
  • 工作那些事儿(5)- 机会
  • ASP.NET中Html.Partial和Html.Action的一个区别
  • ffmpeg架构和解码流程分析
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2019.2.20 c++ 知识梳理
  • CODING 缺陷管理功能正式开始公测
  • CSS3 变换
  • DOM的那些事
  • Koa2 之文件上传下载
  • Laravel 中的一个后期静态绑定
  • Leetcode 27 Remove Element
  • PHP那些事儿
  • RxJS: 简单入门
  • Sass 快速入门教程
  • 第十八天-企业应用架构模式-基本模式
  • 机器学习 vs. 深度学习
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 深入浏览器事件循环的本质
  • 译有关态射的一切
  • 与 ConTeXt MkIV 官方文档的接驳
  • 06-01 点餐小程序前台界面搭建
  • 阿里云服务器购买完整流程
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #大学#套接字
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (算法)Travel Information Center
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (循环依赖问题)学习spring的第九天
  • (一)UDP基本编程步骤
  • (转)Sql Server 保留几位小数的两种做法
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net Redis的秒杀Dome和异步执行
  • .NET6实现破解Modbus poll点表配置文件
  • .net网站发布-允许更新此预编译站点
  • .NET中winform传递参数至Url并获得返回值或文件
  • [Android] Upload package to device fails #2720
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [Erlang 0129] Erlang 杂记 VI 2014年10月28日
  • [Hibernate] - Fetching strategies
  • [iOS]如何删除工程里面用cocoapods导入的第三方库