为了允许Android开发者工具(ADT)能够与您的view交互,您必须提供一个能够获取Context和作为属性的AttributeSet对象的构造函数


class PieChart extends View {
public PieChart(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
}
}

能够为您的自定义view添加这些行为,您必须:

  • 在资源元素<declare-styleable>中为您的view定义自定义属性。
  • 在您的XML布局中指定属性的值。
  • 在运行时取得属性值。
  • 将取回的属性值应用到您的view中。

为了定义已经有属性,请在您的项目组添加<declare-styleable>资源。这些资源通常是放在res/values/attrs.xm文件里。如下是attrs.xml文件的一个例子:


<resources>;
<declare-styleable name="PieChart">
<attr name="showText" format="boolean" />
<attr name="labelPosition" format="enum">
<enum name="left" value="0"/>
<enum name="right" value="1"/>
</attr>
</declare-styleable>
</resources>

这些代码声明了两个自定义属性:"showText"和"labelPosition",他们属于一个叫做PieChart的样式实体。按照惯例,样式实体的名字是和声明的自定义view类名是相同的。尽管遵循这个惯例不是绝对必要的,但很多有名的代码编写者都基于这个命名惯例来提供声明。


您的自定义属性属于不同的命名空间。它们属于http://schemas.android.com/apk/res/[your package name] 以取代默认的http://schemas.android.com/apk/res/android命名空间。本例显示如何为PieChart使用这些定义过的属性:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews">
<com.example.customviews.charting.PieChart
custom:showText="true"
custom:labelPosition="left" />
</LinearLayout>

为了不重复这个长的命名空间URI,本例使用了一个xmlns指示。这个指示指定了别名custom为命名空间http://schemas.android.com/apk/res/com.example.customviews您可以为您的命名空间选择任意的别名。

注意您用来向布局中添加自定义view的XML标签的名字。这是自定义view类的完全表述。如果您的view内是一个内部类,您必须使用外部类的名字进一步限定它。例如,PieChart类有一个叫做PieView的内部类。为了使用这个类中的自定义属性,您必须使用标签com.example.customviews.charting.PieChart$PieView。


将AttributeSet传递给obtainStyledAttributes()方法。这个方法传回了一个TypedArray数组,包含了已经解除引用和样式化的值。

为了时能能够更容易的调用obtainStyledAttributes()方法,Android资源编译器做了大量的工作。res文件夹中的每个<declare-styleable>资源,生成的R.java都定义了一个属性ID的数组以及一套定义了指向数组中的每一个属性的常量。您可以使用预定义的常量从TypedArry中读取属性。下例是PieChart类是如何读取这些属性的

public PieChart(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.PieChart,
0, 0);

try {
mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
} finally {
a.recycle();
}
}

TypedArry对象是一个共享的资源,使用完毕必须回收它


属性是控制view的行为和外观的强有力的方式,但是只有view在初始化后这些属性才可读。为了提供动态的行为,需要暴露每个自定义属性的一对getter和setter。下面的代码片段显示PieChart是如何提供showText属性的。


public boolean isShowText() {
return mShowText;
}

public void setShowText(boolean showText) {
mShowText = showText;
invalidate();
requestLayout();
}

遵从的准则:暴露您view中所有影响可见外观的属性或者行为


注意,设置属性时应该调用invalidate()和requestLayout()。这些调用关键是为了保证view行为是可靠的。你必须在改变这个可能改变外观的属性后废除这个view,这样系统才知道需要重绘。同样,如果属性的变化可能影响尺寸或者view的形状,您需要请求一个新的布局。忘记调用这些方法可能导致难以寻找的bug。










更多相关文章

  1. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. android源码中的c c++库( android中动态和静态版本都有的库)
  4. 分析(Android下的任务和Activity栈)
  5. android Bitmap类方法属性 详细说明
  6. [无线] AndroidManifest.xml配置文件详解
  7. Android(安卓)单选/复选控件
  8. 如何定制android源码的编译选项 & 后期安装?
  9. Suggestion: add 'tools:replace="android:label"' to element a

随机推荐

  1. BaseAdapter
  2. android的动画实例
  3. Android中图片的放大和缩小源码
  4. Android(安卓)判断获取的时间是否是今天
  5. Android(安卓)Spinner控件的简单应用
  6. Android(安卓)7.0版本升级解析包错误
  7. Eclipse 开发 Android, Hello Spinner( 学
  8. Android(安卓)Studio 打造一个适合自己开
  9. Android使用xml中定义的动画效果
  10. Android缓存的引用