博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android组合自定义控件
阅读量:2060 次
发布时间:2019-04-29

本文共 4247 字,大约阅读时间需要 14 分钟。

第一步:设置控件需要的属性

value目录下面新建一个attrs.xml属性文件

然后在里面设置控件属性,首先设置控件名称,name里面即你自定义的控件名称

这步完成之后,在里面为你的控件添加属性:

name是属性名称,format是属性类型

最外层的是控件属性名称,里面就是控件的各个属性,属性的话还需要指定它的属性类型,具体有哪些类型,可以参考我的另外一篇文章,里面说的很详细:http://blog.csdn.net/fanxl10/article/details/41316013

这样设置完毕之后进行第二步操作

第二步:创建自定义View对象

packagecom.fanxl.fxlcustomview.widght; importcom.fanxl.fxlcustomview.R; importandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.drawable.Drawable;importandroid.util.AttributeSet;importandroid.view.Gravity;importandroid.widget.Button;importandroid.widget.RelativeLayout;importandroid.widget.TextView; /** * 自定义控件——组合模式 * @author fanxl * */public class FanTitleextends RelativeLayout{ //里面的控件元素privateButton leftbt, rightbt;privateTextView title; //自定义的控件属性private int leftTextColor;private Drawable leftBackground;private String leftText; private int rightTextColor;private Drawable rightBackground;private String rightText; private float titleTextSize;private int titleTextColor;private String titleText; //控件位置信息参数private LayoutParams leftParams, rightParams, titleParams; @SuppressLint("NewApi")public FanTitle(Context context, AttributeSet attrs) {super(context,attrs); //读取xml中自定义的控件属性TypedArrayta = context.obtainStyledAttributes(attrs, R.styleable.FanTitle);leftTextColor= ta.getColor(R.styleable.FanTitle_leftTextColor, 0);leftBackground= ta.getDrawable(R.styleable.FanTitle_leftBackground);leftText= ta.getString(R.styleable.FanTitle_leftText); rightTextColor= ta.getColor(R.styleable.FanTitle_rightTextColor, 0);rightBackground= ta.getDrawable(R.styleable.FanTitle_rightBackground);rightText= ta.getString(R.styleable.FanTitle_rightText); titleTextColor= ta.getColor(R.styleable.FanTitle_titleTextColor, 0);titleTextSize= ta.getDimension(R.styleable.FanTitle_titileTextSize, 0);titleText= ta.getString(R.styleable.FanTitle_title); //记得回收ta.recycle(); //创建里面的控件leftbt= new Button(context);rightbt= new Button(context);title= new TextView(context); //设置读取出来的控件属性leftbt.setText(leftText);leftbt.setBackground(leftBackground);leftbt.setTextColor(leftTextColor); rightbt.setText(rightText);rightbt.setBackground(rightBackground);rightbt.setTextColor(rightTextColor); title.setText(titleText);title.setTextColor(titleTextColor);title.setTextSize(titleTextSize);title.setGravity(Gravity.CENTER); //设置自定义控件的默认背景颜色setBackgroundColor(0xFFF59563); //设置位置信息leftParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);addView(leftbt,leftParams); rightParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);addView(rightbt,rightParams); titleParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);titleParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);addView(title,titleParams);} }

第三步:XML布局中引用自定义控件

需要注意,要使用我们自己的命名空间:

xmlns:fxl="http://schemas.android.com/apk/res/com.fanxl.fxlcustomview"

第四步:扩展和完善我们的自定义控件

设置完毕之后的效果如下,这个时候我们是不能点击两边的按钮,还需要完善自定义控件

 

想要实现上面的需求,就需要添加回调函数:

privateFanTitleClickListener clickListener; //添加接口回调方法供外部使用public interfaceFanTitleClickListener{publicvoid leftClick();publicvoid rightClick();} public voidsetOnTitleClickListener(FanTitleClickListener clickListener){this.clickListener=clickListener;}给按钮添加点击事件:leftbt.setOnClickListener(newOnClickListener() { @Overridepublicvoid onClick(View v) {clickListener.leftClick();}}); rightbt.setOnClickListener(newOnClickListener() { @Overridepublicvoid onClick(View v) {clickListener.rightClick();}});

最后,在外部实现这个回调函数,并在函数中实现具体的操作:

FanTitle main_title =(FanTitle) findViewById(R.id.main_title);main_title.setOnTitleClickListener(newFanTitleClickListener() { @Overridepublicvoid rightClick() {Toast.makeText(MainActivity.this, "右边点击了", Toast.LENGTH_SHORT).show();} @Overridepublicvoid leftClick() {Toast.makeText(MainActivity.this, "左边点击了", Toast.LENGTH_SHORT).show();}});

到此,我们点击按钮就会有提示信息。

除了这些,我们还可以针对自己的需要来完善这个组件,比如,可以隐藏左右边的按钮,那么只需要在控件内部提供方法供外部设置即可,或者在xml文件中添加属性,这些都是可以的。

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-45》338.比特位计数
查看>>
读书摘要系列之《kubernetes权威指南·第四版》第一章:kubernetes入门
查看>>
Leetcode C++《热题 Hot 100-46》739.每日温度
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
[Kick Start 2020] Round A 2.Plates
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>