- 浏览: 70477 次
- 性别:
- 来自: 北京
最新评论
自定义组合控件的总结
转载请注明出处:http://renyuan-1991.iteye.com/blog/2306381
第一步:在Values中添加attrs.xml文件,首先搞清楚attts.xml怎么用,下面是一个完整的属性文件。控件的属性其实就为给我们提供某些信息的,我们在区分这个属性的时候不需要去想它能干什么,只要知道它能带来什么就行。比如format为string类型的属性,我们只要知道这个属性能为我们提供string类型的字符串就行,用来干什么依个人喜好而定。
在定义Activity的属性时会用到位或运算这个属性,如:
这样做的好处就是减少数据传输,只需要传递一个int值就ok啦。
属性定义时是可以指定多种类型值的,如:
使用:
第二步:自定义控件的实现
自定义的空间一般都有三个构造函数,这三个构造函数是有一些区别的:
一个参数的构造函数:
在Code中实例化一个View时调用。
两个参数的构造函数:
在xml中定义时调用。
三个参数的构造函数:
一般情况下我们需要显示调用并传入style.默认的Style是指它在当前Application或Activity所用的Theme中的默认Style。
接下来就要往我们这个布局里面添加内容了,比如说这个布局是一个RelativieLaoyut,我们可以通过
首先读取自定义的属性,如下:
具体的案例详见:GeneralTitle --> http://git.oschina.net/renyuan_1991/MyWidget
获取属性我们也可以利用循环语句,TextView的源码里就是这样写的,如下:
属性定义如下:
这个例子并没有涉及到view得测量,布局,绘制这个三个必经的流程,如果想看怎么利用这几个方法创建完全自定义的view请看前一篇博客:http://renyuan-1991.iteye.com/blog/2232463
转载请注明出处:http://renyuan-1991.iteye.com/blog/2306381
希望爱好编程的小伙伴能加这个群,互相帮助,共同学习。群号: 141877583
转载请注明出处:http://renyuan-1991.iteye.com/blog/2306381
第一步:在Values中添加attrs.xml文件,首先搞清楚attts.xml怎么用,下面是一个完整的属性文件。控件的属性其实就为给我们提供某些信息的,我们在区分这个属性的时候不需要去想它能干什么,只要知道它能带来什么就行。比如format为string类型的属性,我们只要知道这个属性能为我们提供string类型的字符串就行,用来干什么依个人喜好而定。
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="GeneralTitle"> <!-- 该属性用来获取String信息 --> <attr name="name" format="string"/> <!-- 提供资源文件的引用,如:@drawable/图片ID --> <attr name="name" format="reference"/> <!-- 提供颜色值 如:#00FF00--> <attr name="name" format="color"/> <!-- 提供一个boolean值 如:true --> <attr name="name" format="boolean"/> <!-- 提供一个尺寸值 如:42dip --> <attr name="name" format="dimension"/> <!-- 提供一个浮点类型的数值 如:2.2 --> <attr name="name" format="float"/> <!-- 提供一个整数类型的数值 如:2 --> <attr name="name" format="integer"/> <!-- 提供一个百分比 如:100% --> <attr name="name" format="fraction"/> <!-- 枚举值的定义 --> <attr name="orientation"> <enum name="horizontal" value="0" /> <enum name="vertical" value="1" /> </attr> <!-- 位或运算(这个从来没用过...) --> <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> </declare-styleable> </resources>
在定义Activity的属性时会用到位或运算这个属性,如:
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden"
这样做的好处就是减少数据传输,只需要传递一个int值就ok啦。
属性定义时是可以指定多种类型值的,如:
<attr name = "background" format = "reference|color" />
使用:
android:background = "@drawable/图片ID|#00FF00"
第二步:自定义控件的实现
自定义的空间一般都有三个构造函数,这三个构造函数是有一些区别的:
一个参数的构造函数:
在Code中实例化一个View时调用。
两个参数的构造函数:
在xml中定义时调用。
三个参数的构造函数:
一般情况下我们需要显示调用并传入style.默认的Style是指它在当前Application或Activity所用的Theme中的默认Style。
接下来就要往我们这个布局里面添加内容了,比如说这个布局是一个RelativieLaoyut,我们可以通过
LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true)这行代码直接从xml中读取一个布局,但是这样会让布局的嵌套又多了一层,因为inflate这个函数的第二个参数就是当前布局,这样就是把xml文件读取的布局添加到我们这个自定义布局中。我们可以通过自己创建控件通过addView()方法生成组合控件。
首先读取自定义的属性,如下:
//读取属性集合 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.GeneralTitle); //然后从该属性集合中取出自定义属性,如果在xml没有添加对应的属性这里获取的就是null,我们也可以通过这个值来判断是不是要生成对应的控件。 CharSequence title= ta.getText(R.styleable.GeneralTitle_title_text); int textColor = ta.getColor(R.styleable.GeneralTitle_title_textcolor,0xffffff); float textSize = ta.getDimension(R.styleable.GeneralTitle_title_textsize,18); Drawable leftPic = ta.getDrawable(R.styleable.GeneralTitle_title_left_pic); Drawable rightPic = ta.getDrawable(R.styleable.GeneralTitle_title_right_pic); float picWidth = ta.getDimension(R.styleable.GeneralTitle_title_pic_width,0); float title_leftpic_verticalpadding = ta.getDimension(R.styleable.GeneralTitle_title_leftpic_verticalpadding,0); float title_leftpic_horizontalpadding = ta.getDimension(R.styleable.GeneralTitle_title_leftpic_horizontalpadding,0); float title_rightpic_verticalpadding = ta.getDimension(R.styleable.GeneralTitle_title_rightpic_verticalpadding,0); float title_rightpic_horizontalpadding = ta.getDimension(R.styleable.GeneralTitle_title_rightpic_horizontalpadding,0); float title_leftpic_leftmagin = ta.getDimension(R.styleable.GeneralTitle_title_leftpic_leftmagin,0); float title_rightpic_rightmagin = ta.getDimension(R.styleable.GeneralTitle_title_rightpic_rightmagin,0); ta.recycle();//属性拿到后一定要记得释放。 if(null != title) { //标题 TextView text_title = new TextView(context); text_title.setText(title); text_title.setTextColor(textColor); text_title.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize); LayoutParams ttp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); ttp.addRule(CENTER_IN_PARENT); this.addView(text_title, ttp); } if (null != leftPic){ //左边的图片 ImageView imageview_left = new ImageView(context); imageview_left.setImageDrawable(leftPic); imageview_left.setPadding((int) title_leftpic_horizontalpadding, (int)title_leftpic_verticalpadding,(int)title_leftpic_horizontalpadding, (int)title_leftpic_verticalpadding); LayoutParams ilp = new LayoutParams((int) picWidth, ViewGroup.LayoutParams.MATCH_PARENT); ilp.addRule(ALIGN_PARENT_LEFT); ilp.addRule(CENTER_VERTICAL); ilp.setMargins((int) title_leftpic_leftmagin,0,0,0); imageview_left.setOnClickListener(this); imageview_left.setTag("investor_title_imageview_left"); this.addView(imageview_left, ilp); } if(null != rightPic) { //右边的图片 ImageView Imageview_right = new ImageView(context); Imageview_right.setImageDrawable(rightPic); Imageview_right.setPadding((int)title_rightpic_horizontalpadding,(int)title_rightpic_verticalpadding,(int)title_rightpic_horizontalpadding,(int)title_rightpic_verticalpadding); LayoutParams irp = new LayoutParams((int)picWidth, ViewGroup.LayoutParams.MATCH_PARENT); irp.addRule(ALIGN_PARENT_RIGHT); irp.addRule(CENTER_VERTICAL); irp.setMargins(0,0, (int) title_rightpic_rightmagin,0); Imageview_right.setOnClickListener(this); Imageview_right.setTag("investor_title_imageview_right"); this.addView(Imageview_right, irp); }
具体的案例详见:GeneralTitle --> http://git.oschina.net/renyuan_1991/MyWidget
获取属性我们也可以利用循环语句,TextView的源码里就是这样写的,如下:
int resourceId = -1; TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.MyImageView); ImageView iv = new ImageView(context); TextView tv = new TextView(context); int N = typeArray.getIndexCount(); for(int i = 0 ;i<N;i++){ int attr = typeArray.getIndex(i); switch (attr) { case R.styleable.MyImageView_Oriental: resourceId = typeArray.getInt(R.styleable.MyImageView_Oriental, 0); // this.setOrientation(resourceId == 1 ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL); break; case R.styleable.MyImageView_Text: //获取资源,第二个参数是默认值 resourceId = typeArray.getResourceId(R.styleable.MyImageView_Text, 0); //通过判断资源id是否存在,如果是存在说明在定义的时候定义的是字符串的资源id这里就通过资源id拿到字符,如果不是资源id就直接的到定义时的字符串 tv.setText(resourceId>0? typeArray.getResources().getText(resourceId):typeArray.getString(R.styleable.MyImageView_Text)); break; case R.styleable.MyImageView_Src: resourceId = typeArray.getResourceId(R.styleable.MyImageView_Src, 0); //拿到资源id 如果有就设置给图片,如果没有就直接显示系统的图标 iv.setImageResource(resourceId>0?resourceId:R.drawable.ic_launcher); break; } } addView(iv); addView(tv); typeArray.recycle();//最后要清空属性集合
属性定义如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyImageView"> <attr name="Text" format="reference|string"></attr> <!-- 枚举的没有format 在使用的时候也只能使用这两个属性 在自定义的时候不用指定枚举的名字,获取这个attr的名字就能拿到xml设置的属性 --> <attr name="Oriental"> <enum name="Horizontal" value="1"></enum> <enum name="Vertical" value="0"></enum> </attr> <attr name="Src" format="reference|integer"></attr> </declare-styleable> </resources>
这个例子并没有涉及到view得测量,布局,绘制这个三个必经的流程,如果想看怎么利用这几个方法创建完全自定义的view请看前一篇博客:http://renyuan-1991.iteye.com/blog/2232463
转载请注明出处:http://renyuan-1991.iteye.com/blog/2306381
希望爱好编程的小伙伴能加这个群,互相帮助,共同学习。群号: 141877583
发表评论
-
通过Url打开app页面并传递参数
2017-12-09 17:56 3976转载请注明出处:http:// ... -
Retrofit+RxJava搭建网络请求和数据解析框架
2017-06-29 18:20 0好久没写博客了,实话说,这一年相比往年可以说没什么进步,工作四 ... -
viewpager指示器
2016-11-08 16:04 0viewpager指示器 实现该需求的几种方法的基本原理和缺点 ... -
Android Studio模板,省去界面重复部分的开发
2016-07-06 16:05 0Android Studio模板,省去界面重复部分的开发 -
android studio 运行java代码
2016-06-21 17:50 2427转载请注明出处: http://renyuan-1991.it ... -
只显示年月的DatePicker
2016-06-12 17:30 3374转载请注明出处:http://renyuan-1991.ite ... -
Android的约束布局ConstaintLayout
2016-06-24 15:05 9923ConstaintLayout的初次使用总结 转载请注明出处 ... -
Android遮罩层引导页的实现
2016-06-03 16:28 0实现遮罩层引导页可以通过以下几种方式,本文主要记录张洪洋Hig ... -
手势密码
2016-05-24 14:52 0我们公司做的是理财产品,所以手势密码这个东西少不了,在写手势密 ... -
线性布局的权重weight使用详解
2016-01-20 14:29 2439对线性布局中权重的理解 转载请注明出处:http://ren ... -
setBackgroundResource导致Padding失效,settextsize
2016-01-18 19:50 1573通过setBackground设置9 patc ... -
NestedScrolling的使用及ScrollView的惯性滑动
2015-12-08 18:14 21570NestedScrolling的使用及ScrollView的惯 ... -
android-async-http使用和取消请求
2015-10-15 12:06 4994android-async-http使用总结 下载最新的包可以 ... -
触摸屏幕取消键盘
2015-10-13 18:09 1585当点击文本框和发送按钮的时候不需要取消键盘,点击屏幕其他按钮或 ... -
四种方式实现ListView中的倒计时一()
2015-09-29 12:33 0的奋斗奋斗奋斗 -
SQLite详解
2015-10-10 15:07 1103概述 SQLite是D.Richar ... -
android 的屏幕适配问题,dp与px的换算
2015-08-08 19:11 1775在进入正题之前先了解 ... -
自定义ViewGroup实现动态创建可换行标签
2015-08-03 15:15 1215转载请注明:http://renyua ... -
Android第三方框架之xListView的使用方法
2014-11-09 19:18 5152==最近向用xListView实现刷新效果,在网上没有找到相关 ...
相关推荐
总结,自定义组合控件是Android开发中的高级技巧,它不仅有助于提高代码的复用性和可维护性,还能让我们更好地理解和运用XML布局思想。通过分析`MyCustomeItem`,我们可以进一步了解自定义控件的实现过程,这对于...
3.)第三种方式:)第三种方式:自定义组合控件 定义一个继承自ViewGroup的自定义组合控件,将标题栏的所有元素封装到一个自定义控件中。这样每次需要标题栏时,只需要在布局文件中添加该自定义控件即可,无需关心...
总结起来,Android自定义组合控件的实现涉及到了对Android UI框架的深入理解和实践,包括继承自定义View或ViewGroup、测量与布局、绘制、事件处理等关键步骤。通过这样的方式,开发者可以构建出功能强大、交互丰富的...
总结来说,Android自定义组合控件涉及到对View和ViewGroup类的理解,以及创建自定义Java类、定义XML属性、布局文件中的实例化和Java代码的交互。通过这样的过程,开发者能够构建出满足特定需求的复杂控件,提高应用...
总结起来,Android自定义组合控件的开发是一个涉及视图继承、测量、布局、绘制、属性设置和事件处理的综合过程。通过实践这个Demo,开发者能够提升对Android UI系统理解,从而更好地满足项目中的个性化需求。
总结来说,实现Android自定义组合控件涉及以下几个步骤: 1. 在`attrs.xml`中定义自定义属性。 2. 创建布局文件,使用自定义属性。 3. 编写Java代码,处理自定义控件的行为,解析并应用属性值。 通过以上步骤,你将...
总结来说,自定义控件和组合控件是提高软件UI灵活性和功能性的关键手段。自定义控件使我们能够创新,而组合控件则让我们能够高效地复用和整合已有组件。理解和掌握这两个概念,对于提升软件的用户体验和开发效率具有...
总结来说,自定义控件属性和组合控件是Android开发中的高级技巧,能够帮助开发者实现高度定制的用户界面。自定义属性允许我们为控件增加更多的可配置选项,而组合控件则让我们能够利用已有组件构建更复杂的视图。...
2. **复合控件**:复合控件是通过组合多个现有控件来构建的新控件。这种方式在实现复杂界面元素时非常有用,例如,一个包含文本框和日历选择器的日期输入控件。在Windows Forms中,可以使用UserControl类,而在WPF中...
下面我们通过一个例子来介绍如何使用组合控件。 实现一个带图片和文字的按钮,整个过程可以分四步走: 第一步,定义一个 layout,实现按钮内部的布局。 第二步,写一个类继承 LinearLayout,导入刚刚的布局,并且...
用户控件是ASP.NET中的基本自定义UI元素,它是通过将多个标准ASP.NET控件组合在一起,形成一个复合控件来实现的。用户控件可以看作是网页的微型版,具有自己的HTML、服务器控件和脚本。创建用户控件的主要步骤包括:...
其中,复合控件是将现有的各种控件组合起来,形成一个新的控件;扩展控件是在现有控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能;自定义控件是直接从System.Windows.Forms.Control...
总结一下,自定义WPF用户控件涉及到XAML的布局设计以及C#后台代码的实现。通过这种方式,我们可以构建出具有特定功能和外观的控件,并在多个WPF窗口中重复使用,从而提高开发效率。在实际应用中,可能还需要考虑数据...
总结来说,创建Android自定义组合控件TitleBar涉及以下几个关键步骤: 1. 选择合适的基础类,如LinearLayout。 2. 重写`onMeasure()`, `onLayout()`, 和 `onDraw()` 方法,实现布局和绘制。 3. 添加子视图并设置相应...
首先,`UserControl`是WPF提供的一种基础控件,它是其他复杂控件的基础,用于组合多个现有控件或元素以创建新的自定义用户界面组件。创建`UserControl`的过程通常包括以下步骤: 1. **创建新项目**:在Visual ...
总结来说,这个案例将教你如何在C#.NET中进行自定义控件开发,特别是用户控件和扩展控件的创建。通过实践,你可以掌握自定义控件的继承与重写,用户控件的组合与设计,以及文件上传功能的实现,这些都是构建高效、...