android组合自定义控件

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

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

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

<declare-styleablename="FanTitle">

</declare-styleable>

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

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

<declare-styleablename="FanTitle">
        <attr name="title"format="string"/>
        <attrname="titileTextSize" format="dimension"/>
        <attrname="titleTextColor" format="color"/>

        <attr name="leftText"format="string"/>
        <attrname="leftBackground" format="reference|color"/>
        <attr name="leftTextColor"format="color"/>

        <attr name="rightText"format="string"/>
        <attrname="rightBackground" format="reference|color"/>
        <attrname="rightTextColor" format="color"/>
</declare-styleable>

最外层的是控件属性名称,里面就是控件的各个属性,属性的话还需要指定它的属性类型,具体有哪些类型,可以参考我的另外一篇文章,里面说的很详细: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;

//自定义的控件属性
privateint leftTextColor;
privateDrawable leftBackground;
privateString leftText;

privateint rightTextColor;
privateDrawable rightBackground;
privateString rightText;

privatefloat titleTextSize;
privateint titleTextColor;
privateString titleText;

//控件位置信息参数
privateLayoutParams 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布局中引用自定义控件

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:fxl="http://schemas.android.com/apk/res/com.fanxl.fxlcustomview"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="${relativePackage}.${activityClass}" >

    <com.fanxl.fxlcustomview.widght.FanTitle
       android:layout_width="match_parent"
        android:layout_height="40dp"
        fxl:title="我的空间"
        fxl:titileTextSize="16sp"
        fxl:titleTextColor="#ff0000"
        fxl:leftText="返回"
        fxl:leftBackground="#e0e0e0"
        fxl:leftTextColor="#000000"
        fxl:rightText="更多"
        fxl:rightBackground="#e9e9e9"
       fxl:rightTextColor="#0000ff">

   </com.fanxl.fxlcustomview.widght.FanTitle>

</RelativeLayout>

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

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() {

@Override
publicvoid onClick(View v) {
clickListener.leftClick();
}
});

rightbt.setOnClickListener(newOnClickListener() {

@Override
publicvoid onClick(View v) {
clickListener.rightClick();
}
});

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

FanTitle main_title =(FanTitle) findViewById(R.id.main_title);
main_title.setOnTitleClickListener(newFanTitleClickListener() {

@Override
publicvoid rightClick() {
Toast.makeText(MainActivity.this, "右边点击了", Toast.LENGTH_SHORT).show();
}

@Override
publicvoid leftClick() {
Toast.makeText(MainActivity.this, "左边点击了", Toast.LENGTH_SHORT).show();
}
});

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

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

时间: 2024-08-10 03:21:43

android组合自定义控件的相关文章

解决一个 Android开发自定义控件问题,无法读取属性值

今天玩了一下Android自定义控件,是一个TextView和ImageButton的组合控件,所有的都写好了,但是运行得不到想要的结果,找了大半天找不到错误,代码如下: 1.工程目录结构 2.imagebtn_with_text.xml <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res

Android:自定义控件样式(Selector)

前言 在开发一个应用程序过程中不可避免的要去修改组件的样式,比如按钮.输入框等.现在就看下如何通过Seletor实现样式的自定义.先看下简单的效果对比 概要实现 首先写这个Selector XML文件,叫做button_selector,放到了drawable文件夹下,大概内容如下所示 1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://sc

android获取自定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度

android获取自定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度 1.获取自定义控件height 在本Activity中获取当前Activity中控件的height: Button button = (Button)findViewById(R.id.button); int buttonHeight = button.getHeight(); 在Activity中获取其他xml文件中控件的height: LayoutInflater factorys = LayoutInflater.fro

android 组合方式自定义控件

实现了<android 群英传>的TopBar的小实例.效果图如下: 记录下来,方便下次查看.主要的原理是将2个Button和一个TextView组合在一个RelativeLayout之中. 代码如下.首先定义自定义属性attrs.xml,也可能是先实现一个控件,然后再抽象出一些属性. <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable

Android 中自定义控件之判断还剩多少可输入字符的EditText

最近做的项目有个需求就是判断一下还 剩多少字符可输入,也就是对EditText 的文本变化做监听 ,功能实现了,但是感觉使用组合方式,每次都要编写,还不如写一个自定义控件来备用.在查看本文时,建议先行参考本人转载的一篇文章:http://blog.csdn.net/android_jiangjun/article/details/39580253 下面进入本文的正题: 首先大家先看一下效果图吧: 本文自定义的控件采用的是组合控件的方式来自定义控件,自定义控件的布局如下 <RelativeLayo

《转载-两篇很好的文章整合》Android中自定义控件

两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs.com/0616--ataozhijia/p/4003380.html Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类,由此就得到了视图部分的基本结构--树形结构 View定义了绘图的基本操作 基本操作由三个函数完

android创建自定义控件

新建一个布局title.xml <?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="wrap_content&q

【转】Android中自定义控件的步骤

原文网址:http://blog.csdn.net/lianchen/article/details/48038969 Android开发中难免遇到需要自定义控件的需求,有些是产品的要求在Android标准控件库中没有满足要求的,有些是开发过程中没有代码的可复用,自己定义的. 一个好的自定义控件应当和Android本身提供的控件一样,封装了一系列的功能以供开发者使用,不仅具有完备的功能,也需要高效的使用内存和CPU.Android本身提供了一些指标:1. 应当遵守Android标准的规范(命名,

android:创建自定义控件

在前面两节我们已经学习了 Android 中的一些常见控件以及基本布局的用法,不过当时 我们并没有关注这些控件和布局的继承结构,现在是时候应该看一下了,如图 3.26 所示. 图   3.26 可以看到,我们所用的所有控件都是直接或间接继承自 View 的,所用的所有布局都是 直接或间接继承自 ViewGroup 的.View 是 Android 中一种最基本的 UI 组件,它可以在屏幕 上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是 在 View 的基础之上又