一、内容描述

根据“慕课网”上的教程,实现一个自定义的View,且该View中使用自定义的属性,同时为该自定义的View定义点击事件的回调方法。

二、定义自定义的属性

在res/valus/ 文件夹下创建一个 attrs.xml 的属性定义文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources> <declare-styleable name="HeadBar">
<attr name="leftButtonText" format="string" />
<attr name="leftButtonTextColor" format="color|reference" />
<attr name="leftButtonTextSize" format="dimension"></attr>
<attr name="centerTextViewText" format="string"></attr>
<attr name="centerTextViewTextSize" format="dimension"></attr>
<attr name="centerTextViewColor" format="color|reference"></attr>
<attr name="rightButtonText" format="string" />
<attr name="rightButtonTextColor" format="color|reference" />
<attr name="rightButtonTextSize" format="dimension"></attr>
</declare-styleable>

<attr name="backgroud_color" format="string"></attr>
   <attr name="bc" format="color|reference"></attr>

</resources>

三、定义使用它的布局文件

这里使用MainActivity的activity_main.xml,内容如下,

其中  xmlns:lib="http://schemas.android.com/apk/res-auto"  一行是定义一个第三方库的名字空间,本例中即为了可以使用自定义的属性

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" > <com.baidu.lulei.customview.HeadBar
xmlns:lib="http://schemas.android.com/apk/res/com.baidu.lulei.customview"
android:id="@+id/headbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
lib:backgroud_color="backgroud_color"
lib:bc="#000011"
lib:centerTextViewColor="#ff00ff"
lib:centerTextViewText="标题"
lib:centerTextViewTextSize="20sp"
lib:leftButtonText="返回"
lib:leftButtonTextColor="#ff0000"
lib:leftButtonTextSize="20sp"
lib:rightButtonText="分享"
lib:rightButtonTextColor="#0000ff"
lib:rightButtonTextSize="20sp" >
</com.baidu.lulei.customview.HeadBar> </RelativeLayout>

四、自定义 HeadBar  类型的View

本例中是它继承自RelativeLayout,因为本例中自定义的View本质上它类似一个容器,为了方便布局,这里使用才集成字RelativeLayout,当然你也可以继承自其它类型的ViewGroup

istener(new OnClickListener() {
            @Override
public void onClick(View v) {
if (listener != null)
listener.leftButtonClick(v);
}
}); rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.rightButtonClick(v);
}
}); this.centerText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.centerTextViewClick(v);
}
});
} public static interface ClickListerner {
public void leftButtonClick(View v); public void rightButtonClick(View v); public void centerTextViewClick(View v);
}
}

五、测试它

从上面的activity_main.xml 布局文件中可以看到,它内部使用了一个自定义类型的HeadBar的View,所以可以在MainActivity中测试它,可以看到我们可以在外部定一个回调方法给自定义的View使用。

package com.baidu.lulei.customview;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView; public class HeadBar extends RelativeLayout {
private Button leftButton;
private Button rightButton;
private TextView centerText; private ClickListerner listener; public void setListener(ClickListerner listener) {
this.listener = listener;
} public HeadBar(Context context, AttributeSet attrs) {
super(context, attrs);
leftButton = new Button(context);
rightButton = new Button(context);
centerText = new TextView(context);
TypedArray ta = context.obtainStyledAttributes(attrs,
R.styleable.HeadBar); String backgroundcolor = attrs
.getAttributeValue(
"http://schemas.android.com/apk/res/com.baidu.lulei.customview",
"backgroud_color");
int bc = attrs
.getAttributeIntValue(
"http://schemas.android.com/apk/res/com.baidu.lulei.customview",
"bc", 0xff0000ff);
Log.e("Log", "bc :" + bc);
Log.e("Log", "backgroundcolor :" + backgroundcolor);
// 初始化左边的那个button
int leftButtonTextColor = ta.getColor(
R.styleable.HeadBar_leftButtonTextColor, 0x000011);
String leftButtonText = ta
.getString(R.styleable.HeadBar_leftButtonText); float leftButtonTextSize = ta.getDimension(
R.styleable.HeadBar_leftButtonTextSize, ); leftButton.setText(leftButtonText);
leftButton.setTextSize(leftButtonTextSize);
leftButton.setTextColor(leftButtonTextColor); // 初始化右边的那个button int rightButtonTextColor = ta.getColor(
R.styleable.HeadBar_rightButtonTextColor, 0xff0000ff);
String rightButtonText = ta
.getString(R.styleable.HeadBar_rightButtonText); float rightButtonTextSize = ta.getDimension(
R.styleable.HeadBar_rightButtonTextSize, );
rightButton.setText(rightButtonText);
rightButton.setTextSize(rightButtonTextSize);
rightButton.setTextColor(rightButtonTextColor); // 初始化中间的TextView
int centerTextColor = ta.getColor(
R.styleable.HeadBar_centerTextViewColor, 0xff000000);
String centerText = ta
.getString(R.styleable.HeadBar_centerTextViewText);
float centerTextSize = ta.getDimension(
R.styleable.HeadBar_centerTextViewTextSize, );
this.centerText.setText(centerText);
this.centerText.setTextSize(centerTextSize);
this.centerText.setTextColor(centerTextColor);
// 释放TypedArray
ta.recycle(); // 开始布局 RelativeLayout.LayoutParams leftButtonLayoutParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
leftButtonLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
leftButton.setLayoutParams(leftButtonLayoutParams); RelativeLayout.LayoutParams rightButtonLayoutParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightButtonLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rightButton.setLayoutParams(rightButtonLayoutParams); RelativeLayout.LayoutParams centerTextLayoutParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
centerTextLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
centerTextLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); this.centerText.setLayoutParams(centerTextLayoutParams);
Log.e("Tag", "" + leftButton.getId());
// 将布局好的三个控件放入自定义的view中去
addView(leftButton);
addView(rightButton);
addView(this.centerText); // 添加点击事件
leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.leftButtonClick(v);
}
}); rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.rightButtonClick(v);
}
}); this.centerText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.centerTextViewClick(v);
}
});
} public static interface ClickListerner {
public void leftButtonClick(View v); public void rightButtonClick(View v); public void centerTextViewClick(View v);
}
}

六、效果

  

七、注意

1. 常见自定义属性的值类型有哪些?

属性类型

使用demo

<attr name = "background" format = "reference" />

android:background = "@drawable/图片ID"

<attr name = "textColor" format = "color" />

android:textColor = "#00FF00"

<attr name = "focusable" format = "boolean" />

android:focusable = "true|false"

<attr name = "layout_width" format = "dimension" />

android:layout_width = "42dip|42sp|42px"

<attr name = "fromAlpha" format = "float" />

android:fromAlpha = "1.0"

<attr name = "frameDuration" weight="integer" />

android:weight = "12"

<attr name = "apiKey" format = "string" />

android:apiKey = "this_is_a_string"

<attr name = "pivotX" format = "fraction" />

android:pivotX = "200%"

<attr name="orientation">

<enum name="horizontal" value="0" />

<enum name="vertical" value="1" />

</attr>

android:orientation = "vertical"

<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" />

</attr>

android:windowSoftInputMode = "stateHidden">

2. attrs.xml中自己使用<attr/>标签的属性怎么获取?

如下两个属性,声明在declare-styleable之外,获取它的值呢?

声明:

<attr name="backgroud_color" format="string"></attr>
<attr name="bc" format="color|reference"></attr>

使用:

注意现在lib是 名字空间   xmlns:lib="http://schemas.android.com/apk/res/"+"应用包名"   的形式

lib:bc="#000011"
lib:backgroud_color="backgroud_color"

获取:

String backgroundcolor = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.baidu.lulei.customview","backgroud_color");
int bc = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/com.baidu.lulei.customview","bc", 0xff0000ff);

3. 读取自定义属性时使用的自定义空间命名规则如何?

如果都是在declare-styleable中声明的属性,那么名字空间可以使用

http://schemas.android.com/apk/res/+”应用包名” 或者 http://schemas.android.com/apk/res-auto

而如果你使用自定义属性是在attr中单独定义的,那么请你使用前者。

4. 附源代码下载  https://github.com/LuLei2013/CustomView.git

android自定义View&&简单布局&&回调方法的更多相关文章

  1. Android自定义View——简单实现边缘凹凸电子票效果

        View继承LinearLayout,在View的上下边缘画出白色的圆形即可,这里只要计算出圆的个数和圆的循环规律即可,下面请看分析 我们取卡片的前2个凹凸来看,将其分为四部分,并且两部分为循 ...

  2. Android零基础入门第24节:自定义View简单使用

    原文:Android零基础入门第24节:自定义View简单使用 当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求. 一.概述 很多初入Andr ...

  3. Android 自定义 view(四)—— onMeasure 方法理解

    前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...

  4. Android 自定义View及其在布局文件中的使用示例

    前言: 尽管Android已经为我们提供了一套丰富的控件,如:Button,ImageView,TextView,EditText等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...

  5. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  6. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

  7. Android 自定义View及其在布局文件中的使用示例(二)

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3530213.html From crash_coder linguowu linguowu0622@gami ...

  8. Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题

    这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐 ...

  9. 简单说说Android自定义view学习推荐的方式

    这几天比较受关注,挺开心的,嘿嘿. 这里给大家总结一下学习自定义view的一些技巧.  以后写自定义view可能不会写博客了,但是可以开源的我会把源码丢到github上我的地址:https://git ...

随机推荐

  1. CF 1005A Tanya and Stairways 【STL】

    Little girl Tanya climbs the stairs inside a multi-storey building. Every time Tanya climbs a stairw ...

  2. hihocoder Counting Islands II(并查集)

    Counting Islands II 描述 Country H is going to carry out a huge artificial islands project. The projec ...

  3. [LA 3942] Remember the Word

    Link: LA 3942 传送门 Solution: 感觉自己字符串不太行啊,要加练一些蓝书上的水题了…… $Trie$+$dp$ 转移方程:$dp[i]=sum\{ dp[i+len(x)+1]\ ...

  4. Codeforces 914 C Travelling Salesman and Special Numbers

    Discription The Travelling Salesman spends a lot of time travelling so he tends to get bored. To pas ...

  5. 洛谷 P1452 Beauty Contest

    题目背景 此处省略1W字^ ^ 题目描述 贝茜在牛的选美比赛中赢得了冠军”牛世界小姐”.因此,贝西会参观N(2 < = N < = 50000)个农场来传播善意.世界将被表示成一个二维平面 ...

  6. 【DFS序】【莫队算法】【权值分块】bzoj2809 [Apio2012]dispatching

    题意:在树中找到一个点i,并且找到这个点子树中的一些点组成一个集合,使得集合中的所有点的c之和不超过M,且Li*集合中元素个数和最大 首先,我们将树处理出dfs序,将子树询问转化成区间询问. 然后我们 ...

  7. 【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)

    Part 1.块状链表.   定位 插入 删除 数组 O(1) O(n) O(n) 链表 O(n) O(1) O(1) 对于线性表的以上常见操作来说,数组和链表都无法有效地解决.但是,若我们将链表的每 ...

  8. [CEOI2017]One-Way Streets

    题目大意: 给你一个无向图,现在告诉你一些点对(u,v), 要你在保证从u到v的所有路径都不变的情况下,尽可能把所有的边变成单向边, 问你可以唯一确定哪些边的方向,以及方向是从u到v还是从v到u. 思 ...

  9. TCP长连接与短连接的区别(转)

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...

  10. Grunt上手指南(转)

    Grunt ,  javascript 我想先花点时间回忆一下作为一个前端需要做的工作(Loading...) JS合并 JS压缩 CSS压缩 CSS Sprite 图片优化 测试 静态资源缓存(版本 ...