zoukankan      html  css  js  c++  java
  • Android开发UI之自定义视图属性

    Android框架中,所有自定义的view类都继承自View,也可以继承Button等view的子类

    为了允许ADT能够与view交互,必须提供一个能够获取Context和作为属性的AttributeSet对象的构造函数。这个构造函数允许布局编辑器建立和编辑view的实例。

     1 public class MyRect extends View {
     2 
     3     public MyRect(Context context) {
     4         super(context);
     5         // TODO Auto-generated constructor stub
     6     }
     7 
     8     public MyRect(Context context, AttributeSet attrs) {
     9         super(context, attrs);
    10         // TODO Auto-generated constructor stub
    11     }
    12 }

    定义自定义属性


    为了在您的用户接口添加内建的(Android自带的)view,您可以在一个XML元素中指定它,并通过元素的属性来控制其外观和行为。写的好的自定义view一样可以通过XML添加和设置样式。为了能够为您的自定义view添加这些行为,您必须:

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

    本节讨论如何定义自定义属性并指定他们的值。下一节则是有关在运行时取得并应用这些值。

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

    1 <resources>;
    2    <declare-styleable name="PieChart">
    3        <attr name="showText" format="boolean" />
    4        <attr name="labelPosition" format="enum">
    5            <enum name="left" value="0"/>
    6            <enum name="right" value="1"/>
    7        </attr>
    8    </declare-styleable>
    9 </resources>

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

    一旦您定义了自定义属性,您可以在布局XML文件中像内建属性一样使用它们。唯一的不同是,您的自定义属性属于不同的命名空间。它们属于http://schemas.android.com/apk/res/your[ package name] 以取代默认的http://schemas.android.com/apk/res/android 命名空间。本例显示如何为PieChart使用这些定义过的属性:

    1 <?xml version"utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3    xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews">
    4  <com.example.customviews.charting.PieChart
    5      custom:showText="true"
    6      custom:labelPosition="left" />
    7 </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。

    ####申请自定义属性


    当view从XML布局中创建了之后,XML标签中所有的属性都从资源包中读取出来并作为一个AttributeSet传递给view的构造函数。尽管从AttributeSet中直接读取值是可以的,但是这样做有一些缺点:

    • * 带有值的资源引用没有进行处理
    • * 样式并没有得到允许

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

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

     1 public PieChart(Context ctx, AttributeSet attrs) {
     2    super(ctx, attrs);
     3    TypedArray a = context.getTheme().obtainStyledAttributes(
     4         attrs,
     5         R.styleable.PieChart,
     6         0, 0);
     7 
     8    try {
     9        mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
    10        mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
    11    } finally {
    12        a.recycle();
    13    }
    14 }

    还有这篇文章:http://blog.csdn.net/lilu_leo/article/details/7449973

  • 相关阅读:
    图的深度遍历
    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    满汉全席
    2-sat(模板)
    2-sat
    花匠
    维护序列NOI2005
    序列终结者
    杨辉三角
  • 原文地址:https://www.cnblogs.com/liyiran/p/4648638.html
Copyright © 2011-2022 走看看