android AttributeSet API 之开发案例

android AttributeSet API 之开发案例

在通过xml文件构造view组件的时候,往往都要使用到AttributeSet和defStyle这个两个参数。

 public class myButton extends Button{
public myButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, defStyle, 0);
}
}

此时,

context会调用obtainStyledAttributes( AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)方法获得一个TypedArray,然后根据这个TypeArray来设置组件的属性。obtainStyledAttributes这类方法有好几个,真正的实现是Resources.Theme类,分别是:

   obtainStyledAttributes( AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) : TypedArray
   obtainStyledAttributes( int resid, int[] attrs)  : TypeArray
   obtainStyledAttributes(int[] attrs) : TypeArray

在第一种方法里根据attrs确定要获取哪些属性,然后依次通过其余3个参数来取得相应的属性值,属性值获取的优先级从高到低依次是set, defStyleAttr, defStyleRes. defStyleAttr是一个reference, 它指向当前Theme中的一个style, style其实就是各种属性的集合,如果defStyleAttr为0或者在Theme中没有找到相应的style, 则 才会尝试从defStyleRes获取属性值,defStyleRes表示的是一个style的id,
当它为0时也无效。方法(2)和(3)分别表示从style或Theme里获取属性值。

例如:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, defStyle, 0);

attr是在/res/values/attrs.xml文件下定义的,除了系统组件本身的属性,我们也可以自定义属性,然后在layout布局中使用。attrs.xml里通常包括若干个attr集合,例如

<declare-styleable name="LabelView">
        <attr name="text" format="string" />
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
    </declare-styleable>

就表示一个attr集合,declare-styleable标签里的name值表示的就是上面方法里的attrs参数,android会自动在R文件中生成一个数组, 它可以使任意的不一定要是view组件名称。在集合里定义每个属性的名称和它的类型,据偶所见总共有reference, string, color, dimension, boolean等,如果允许多个类型可以用"|"来隔开,比如reference
| color, attr还可以这样定义

 <attr name="layout_height" format="dimension">
       <enum name="fill_parent" value="-1" />
       <enum name="match_parent" value="-1" />
       <enum name="wrap_content" value="-2" />
    </attr>

当attr的定义没有指明format时,表示它已经在其他地方定义过了,所以你可以定义一个attr集合,里面的都是已经定义好的属性(例如系统组件的属性), 然后通过obtainStyledAttributes方法来获取这些属性值,例如

<declare-styleable name="Gallery1">
        <attr name="android:galleryItemBackground" />
    </declare-styleable>

当然,我们也需要声明自己的命名空间

xmlns:app="http://schemas.android.com/apk/res/your_package_name"

R文件中会有styleable和attr这两个类,当我们要使用哪个属性集合或哪个属性的时候用的是styleable, 而attr类定义的仅仅是attr这个属性在layout中的id. AttributeSet有两个方法分别是

int getAttributeNameResource(int index);

int getAttributeResourceValue(int index, int defaultValue);

前一个方法获取的就是attr属性名称的id,也也就是attr类定义的数值,后一个方法获取的才是attr属性值。

例如,如果我们希望自定义ActionBar以适应不同的场景需要

<com.jeason.jeasonactionbar.MyActionBar
xmlns:bar="http://schemas.android.com/apk/res/com.jeason.jeasonmapraiders"
android:layout_height="@dimen/gd_action_bar_height"
android:layout_width="fill_parent"
android:layout_alignParentTop="true"
bar:type="normal"
bar:title="Campus Map"/>
public class MyActionBar extends LinearLayout {
private CharSequence mTitle;
private MyActionBar.Type mType;
    public enum Type {
Normal,
Dashboard,
Dashboard
}
ublic MyActionBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, defStyle, 0);
mTitle = a.getString(R.styleable.ActionBar_title);
int layoutID;
int type = a.getInteger(R.styleable.ActionBar_type, -1);
switch (type) {
case 2:
mType = Type.Empty;
layoutID = R.layout.gd_action_bar_empty;
break;
case 1:
mType = Type.Dashboard;
layoutID = R.layout.gd_action_bar_dashboard;
break;
case 0:
default:
mType = Type.Normal;
layoutID = R.layout.gd_action_bar_normal;
break;
}
LayoutInflater.from(context).inflate(layoutID, this);
a.recycle();
}

相应的在values/attrs.xml文件中

<declare-styleable name="ActionBar">
<attr name="title" format="string" />
<attr name="type">
<enum name="normal" value="0" />
<enum name="dashboard" value="1" />
<enum name="empty" value="2" />
</attr>
</declare-styleable>

时间: 2024-11-14 12:26:00

android AttributeSet API 之开发案例的相关文章

android AttributeSet API

android   AttributeSet API public interface AttributeSet android.util.AttributeSet 已知间接子类 XmlResourceParser 类概述 属性的集合,通常在xml文档中出现,一般来说,你不会想直接去使用它,而是通过能够为你解释属性的Resources.Theme.obtainStyledAttributes()来使用它.特别的,Resources API 将转换引用资源(好比.xml文件中的"@string/m

Android Day01-电话拨号器案例&Android开发流程

电话拨号器开发步骤: 1.在清单文件中添加打电话的权限 <?xml version="1.0"encoding="utf-8"?>       <manifestxmlns:android="http://schemas.android.com/apk/res/android"             package="cn.itcast.action"             android:version

Android开发之通过Android的API对sqlite数据库的操作以及数据库事务的练习

一.通过Android的API对sqlite数据库的操作 通过已有的ContentValues类,实例一个对象value来调用其中内部的方法来操作sqlite数据库 代码: package com.example.databasedemo; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sql

Android企业级应用程序开发完整训练:精通Android商业级开发最佳实践的24堂课

从企业级商业实战的角度入手,24小时内通过23个动手实战案例,循序渐进的对Android商业级别的应用程序开发要点各个击破,依托于在多年的Android(6款完整的硬件产品和超过20款应用软件)开发和企业级培训经验(超过150期的次Android的企业内训和公开课),旨在在实务的基础之上帮助你完成任何复杂程序的高质量Android应用程序开发,让Android开发跟上想象的速度.最后,通过ActivityManagerService揭秘Android应用程序一切行为背后的核心根源,让你从此开发应

Android Compatibility package 兼容性开发套件

我们认为Android 3.0平板电脑操作系统在美国时间2011年2月22日的正式推出,对于Android手机应用程序开发者所象征的意涵是: 之前大家所开发过的Android手机应用,除了可以在Android智能手机系统之上运行外,也因为Android 3.0平板电脑操作系统的向下兼容之故,致使这些Android手机应用能跨足到Android平板电脑操作系统的新领域之中. 然而,Android官方认为这还不够! 假若,专为Android 3.0平板电脑操作系统所开发的应用程序,能够兼容于其它An

安卓一键ROOT, android root api sdk 服务支持

android 一键root sdk已经开发完毕,支持PC 及手机端: 鉴于现在手机端的需求比较大,特提供SDK外放服务:以及ROOT技术支持: 商务合作  ROOT后您可以: 1.删除系统应用,定制个性化系统 2.各种暗扣(当然现在国内环境不行,但是您有渠道还是可以的) 3.静默安装各种推广APP 4.打压竞争对手APP 5.后台静默刷流量 6.完全控制他人手机 7.等等等 安卓一键root sdk 服务,安卓root技术支持, android root sdk, android root a

Android studio 百度地图开发(5)查询周边服务(加油站)

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 百度地图应用(1):Android studio 百度地图开发(1)配置工程.显示地图 百度地图应用(2):Android studio 百度地图开发(2)地图定位 百度地图应用(3):Android studio 百度地图开发(3)地图导航 百度地图应用(4):Android studio 百度地图开发(4)触摸选点

Android 中带你开发一款自动爆破签名校验工具 kstools

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Android中带你开发一款自动爆破签名校验工具kstools - 生死看淡,不服就干! - 博客频道 - CSDN.NET 生死看淡,不服就干! http://www.wjdiankong.cn 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &n

android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词

在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将一下载入在线歌词.好了,还是用那张图. 在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api.尽管还是资源不全.并且还有非常多错误. 特别头疼的是有时候歌词竟然不分行.解析起来简直难受. 歌词迷api歌词查询地址:http://geci.me/api/lyric/