android开发系列之使用xml自定义控件
在android开发的过程中,有的时候面对多个Activity里面一些相同的布局,我们需要写多次相同的代码,同时这种方法给我们的项目维护也带来了很大不便。那么有没有一种可行的办法能够将Activity里面相同的布局拆分的很清楚呢?当然是有的,这个时候就轮到自定义控件闪亮登场了。
其实在android里面有多种方法去实现自定义控件,但是今天这篇博客里面只介绍使用xml的方式进行自定义控件的创建。请看下面的这种场景,不管在哪个页面里面都有个标题,包括一条居中的文本信息和在左边的返回按钮。这个时候我们就可以将上面的标题拆分成一个控件,然后在该控件里面暴露出一个text属性和一个按钮的点击事件。
首先让我们先来创建一个前台的xml文件用于放置布局,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/test"
android:gravity="center_vertical"> <TextView
android:id="@+id/tvBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<"
android:layout_alignParentLeft="true" /> <TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
android:layout_centerHorizontal="true"/> </RelativeLayout>
可以看到在上面的布局里面,我们只是放置了两个TextView,一个表示返回,另一个则表示title。
看到这里聪明的你也许就能猜到了,会不会在自定义控件的时候,我们也同样需要采用某种方法加载上面的布局文件,然后在加载的时候同时关联自己定义好的属性和事件到上面返回的TextView点击事件和标题的TextView的text属性呢?是的,请看比较重要的后台关联代码类定义:
public class TitleControl extends RelativeLayout {
}
可以发现TitleControl我们是直接从RelativeLayout继承而来的,这样的话TitleControl就属于一种View控件了。接下来所要做的事情,就是定义属性和事件了。现在假设我们需要定义一个MyText属性,那么应该怎么做呢?请看如下代码:
public class TitleControl extends RelativeLayout {
private TextView tvBack, tvTitle;
private String title;
public TitleControl(Context context) {
super(context);
}
public TitleControl(Context context, AttributeSet attrs) {
super(context, attrs);
View view = View.inflate(context, R.layout.activity_title, this);
tvTitle = (TextView) view.findViewById(R.id.tvTitle);
tvBack = (TextView) view.findViewById(R.id.tvBack);
tvBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.title);
title = a.getString(R.styleable.title_MyText);
a.recycle();
tvTitle.setText(title, TextView.BufferType.SPANNABLE);
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
}
在上面的代码里面我们通过View的inflate方法加载前台页面,然后通过findViewById方法就找到了前台需要关联的控件了。但是我们自己定义的属性放在哪里呢?一种比较容易维护的做法就是将属性放置在xml文件里面。下面就让我们来看看属性的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="title">
<attr name="MyText" format="string"/>
</declare-styleable>
</resources>
当我们定义好属性xml之后,就可以通过下面的这段代码,将我们自己定义的MyText属性关联到TextView的Text属性上面了。这样就相当于实现了自定义属性。
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.title);
title = a.getString(R.styleable.title_MyText);
a.recycle(); tvTitle.setText(title, TextView.BufferType.SPANNABLE);
做到这里我们就差一个自定义事件了,那么我们怎样去定义一个事件关联到TextView的点击上面呢?答案是通过回调方法的方式实现的,请看回调方法的定义:
private ITitleCallback iTitleCallback;
public interface ITitleCallback {
void OnBackClickLinear();
}
public void setTitleClickLinear(ITitleCallback iTitleCallback) {
this.iTitleCallback = iTitleCallback;
}
然后在TextView点击的时候执行如下代码就可以了:
tvBack = (TextView) view.findViewById(R.id.tvBack);
tvBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(iTitleCallback!=null){
iTitleCallback.OnBackClickLinear();
}
}
});
好了,今天就到这里吧!如有不对,欢迎拍砖。
android开发系列之使用xml自定义控件的更多相关文章
- Android 开发系列教程之(一)Android基础知识
什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...
- Android开发系列(十八):自己定义控件样式在drawable目录下的XML实现
在Android开发的过程中,我们常常须要对控件的样式做一下改变,能够通过用添加背景图片的方式进行改变,可是背景图片放多了肯定会使得APK文件变的非常大. 我们能够用自己定义属性shape来实现. s ...
- Android开发系列之按钮事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity ...
- Android开发系列之调用WebService
我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到 ...
- Android开发系列之Android项目的目录结构
今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目 ...
- Android开发系列之学习路线图
通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明 ...
- Android开发系列之button事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的样例. 文件夹结构还是引用上篇blog的截图. 详细实现代码: public class MainActivity extends Activit ...
- android开发系列之aidl
aidl在android开发中的主要作用就是跨进程通讯来着,说到进程相比很多人都是非常熟悉了,但是为什么会有跨进程通讯这个概念呢?原来在android系统中,有这么一套安全机制,为了各个Apk数据的独 ...
- [Android开发系列]IT博客应用
1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...
随机推荐
- Mybatis Plugin插件安装破解及使用
2018年2月更新 2018年2月份,提供一个网上比较多的一个版本V3.21版本,下载资源里面有个已整合版直接解压放入C:\Users\你的用户名\.IntelliJIdea2017.3\config ...
- pat 团体天梯赛 L2-012. 关于堆的判断
L2-012. 关于堆的判断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的小顶堆H[] ...
- js Regex match, exec, test & jquery plugin, visit the official website!
http://plugins.jquery.com/?s=bootstrap 1. /reg/.test(strval) 2."strval".match(/reg/g), a r ...
- java常见设计模式简要总结
设计模式六大原则 1.开放封闭原则:对扩展开放,对修改封闭,意即程序拓展时不要动原有的代码 2.LSP原则:任何基类可以出现的地方,子类一定可以出现 3.依赖倒置原则:使用接口,依赖于抽象而不是具体 ...
- 【传输文件】文件传输协议FTP、SFTP和SCP
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
- split一些分开一些特殊字符
查看 api ,你就会发现 String.split(String regex); 也就是说里面的参数是正则表达式.如果是一些普通的字符,它就会当做普通字符给拆分字符串.可是 ?是特殊字符,想让按照 ...
- linux 通过MD5监控指定路径文件的变动
脚本须知: 1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限 2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改, ...
- Matcher类详解2-group
Matcher.group是针对()来说的,group(0)就是指的整个串,group(1) 指的是第一个括号里的东西即匹配的第一个子表达式,group(2)指的第二个括号里的东西即匹配的第二个子表达 ...
- 关于URL编码 [转]
转自: http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 作者: 阮一峰 日期: 2010年2月11日 一.问题的由来 URL就是网址, ...
- 稀疏编码(Sparse Coding)的前世今生(一) 转自http://blog.csdn.net/marvin521/article/details/8980853
稀疏编码来源于神经科学,计算机科学和机器学习领域一般一开始就从稀疏编码算法讲起,上来就是找基向量(超完备基),但是我觉得其源头也比较有意思,知道根基的情况下,拓展其应用也比较有底气.哲学.神经科学.计 ...