Android自己定义控件而且使其能够在xml中自己定义属性
为什么要自己定义View
android开发中自己定义View的优点是显而易见的。比方说以下的这个顶部导航,它被设计出如今应用的每一个界面,但每次的内容却不尽同样。我们不能在每一个layout资源中都配置一组同样的View吧?假设使用<include layou="@layout/xxx"/>标签,尽管攻克了布局文件的重用性,可是相关View的初始化设置还是没可以重用(集中),须要每次都採用view.findViewById(id)来初始化他们。
有了对“可重用性”的考量,我们来完毕一次对自己定义View的探索。
第一步,创建自己定义View的布局文件
这里创建的布局文件和平日里为Activity或Fragment创建的布局文件没有差别,比如以下的xml创建了一个上面是图片,以下是文字的自己定义View布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/ic_launcher" /> <TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="asdfasdf" /> </LinearLayout>
第二步,创建继承自View或其子类的自己定义View
package org.xiaom.customView.view;
import org.xiaom.customView.R;
public class MyView extends LinearLayout {
private View root = null;
//上面的img
private ImageView imgView = null;
//img以下的text
private TextView txtView = null;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public MyView(Context context) {
super(context);
initView(context);
}
private void initView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
root = inflater.inflate(R.layout.view_my_view, this,true);
imgView = (ImageView) root.findViewById(R.id.img);
txtView = (TextView) root.findViewById(R.id.txt);
}
}
第三步,在xml中配置、使用自己定义View
在完毕上面的自己定义操作后,接下来就能够像使用android原生组件那样使用我们的自己定义View了。须要注意的是,自己定义View在xml中声明使用时,必须採用全类名(类全名- -)。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 类全名 -->
<org.xiaom.customView.view.MyView
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="aasdfasdfasdfa" /> </LinearLayout>
接下来就非常easy了,我们直接使用Activity.this.setContentView(layouId)方法就可以。
第四步,配置declare-styleable以声明自己定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="myView">
<attr name="img" format="reference" />
<attr name="text" format="string"></attr>
</declare-styleable>
</resources>
第五步,配置自己定义属性并读取、应用
package org.xiaom.customView.view;
import org.xiaom.customView.R;
public class MyView extends LinearLayout {
private View root = null;
// 上面的img
private ImageView imgView = null;
// img以下的text
private TextView txtView = null;
// 上面的图像资源Id
Drawable img;
// 文字内容
String text;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.myView);
img = ta.getDrawable(R.styleable.myView_img);
text = ta.getString(R.styleable.myView_text);
initView(context);
//记得此处要recycle();
ta.recycle();
}
private void initView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
root = inflater.inflate(R.layout.view_my_view, this, true);
imgView = (ImageView) root.findViewById(R.id.img);
txtView = (TextView) root.findViewById(R.id.txt);
//将自己定义属性的值传递给相应View
imgView.setBackgroundResource(R.drawable.icon_consultation);
txtView.setText(text);
}
}
以下的xml表明怎样在xml中配置自己定义属性:
<!-- 我的adt版本号是v22.6.2-1085508,它支持自己主动找寻和验证declare-styleable;假设你的adt不支持此功能,请换成 -->
<!-- xmlns:myView="http://schemas.android.com/apk/org.xiaom.customView.myView",此处我没验证 --> <LinearLayout xmlns:myView="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <!-- 类全名 --> <org.xiaom.customView.view.MyView
android:layout_width="match_parent"
android:layout_height="wrap_content"
myView:img="@drawable/icon_consultation"
myView:text="自己定义Text" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="aasdfasdfasdfa" /> </LinearLayout>
好,大功告成。这里是本博文实例的Eclipseproject。
Android自己定义控件而且使其能够在xml中自己定义属性的更多相关文章
- Winform下让你的DataGridView控件支持点语法(即显示list中的子对象属性)
前言: 不想看前言的直接去看正文吧!另外文末有彩蛋. DataGridView可以支持多种数据源格式,比如DataTable和List. DataTable没啥特殊的,本身就是一张二维的表,可以和Da ...
- Android应用之——自己定义控件ToggleButton
我们经常会看到非常多优秀的app上面都有一些非常美丽的控件,用户体验非常好.比方togglebutton就是一个非常好的样例,IOS系统以下那个精致的togglebutton现在在android以下也 ...
- Android自己定义控件之应用程序首页轮播图
如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...
- Android自己定义控件(状态提示图表)
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...
- Android自己定义控件系列五:自己定义绚丽水波纹效果
尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...
- Android自己定义控件系列案例【五】
案例效果: 案例分析: 在开发银行相关client的时候或者开发在线支付相关client的时候常常要求用户绑定银行卡,当中银行卡号一般须要空格分隔显示.最常见的就是每4位数以空格进行分隔.以方便用户实 ...
- 【Asp.net之旅】--因自己定义控件注冊而引发的思考
前言 近期在开发远洋的SOA系统平台,开发使用的是.NET平台.对于Asp.net并不困难,但该系统的开发并非全然依靠Asp.net.而是自身封装好的框架.这套框架是远洋地产购买的微软的开发平台,项目 ...
- 【Android】自己定义控件——仿天猫Indicator
今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的 ...
- 【Android】自己定义控件实现可滑动的开关(switch)
~转载请注明来源:http://blog.csdn.net/u013015161/article/details/46704745 介绍 昨天晚上写了一个Android的滑动开关, 即SlideSwi ...
随机推荐
- jquery 学习日记之选择器
看完Jquery选择器的教程视频后,对jquery的选择器有一定的认识和了解,现整理一下知识: 一.jquery基本选择器,这类比较简单,一笔带过. #id 选择器,是选择 匹配id值中的第一个元素 ...
- ExecuteNonQuery&& ExecuteQuery 区别
前些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 .但是实际上并不是这样的,好在处理的数据操作多时 修 ...
- pip assert_source_matches_version(self)版本验证报错Source in %s has version %s, which satisfies requirement %s的解决方式
在win8.1下为了安装flask模块,开始安装pip,结果发生了上篇博客里面的错误ntpath join(path, *paths) 发生UnicodeDecodeError.解决之后继续发现版本验 ...
- 各浏览器Cookie大小、个数限制
一.浏览器允许每个域名所包含的cookie数: Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie. Firef ...
- 运输层协议----UDP
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...
- js将数字转换成大写的人民币表达式
function changeNumMoneyToChinese(money) { var cnNums = new Array("零", "壹", " ...
- vbox里面的Ubuntu虚拟机与主机win7之间设置共享文件夹
有时候我们希望虚拟机和主机之间进行通信,例如传一些文件.那么设置共享文件夹就是一种很好的方式. 这里我的主机是win7系统,vbox里面的虚拟机是Ubuntu. 1.首先安装vbox的VBOXGues ...
- linux tcp 好文
http://blog.csdn.net/htttw/article/details/7521053
- bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1189 Solved: 734[Submit][ ...
- [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】
题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...