`
朱润泽
  • 浏览: 47319 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

(转)对AttributeSet和defStyle的理解

 
阅读更多

原文链接:http://blog.csdn.net/czh0766/archive/2010/09/28/5912237.aspx

 

在通过xml文件构造view组件的时候,往往都要使用到AttributeSet和defStyle这个两个参数,例如Button组件的构造方法Button(Context ctx, AttributeSet attrs, int defStyle)中,ctx会调用obtainStyledAttributes( AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)方法获得一个TypedArray,然后根据这个TypeArray来设置组件的属性。obtainStyledAttributes这类方法有好几个,真正的实现是Resources.Theme类,分别是:

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

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

    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>

在layout布局中使用自定义的属性,要指明包名称,需要先定义,例如xmlns:app="http://schemas.android.com/apk/res/your_package_name", 然后就可以这样app:text, app:textSize来设置属性了。

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

    int getAttributeNameResource(int index);

    int getAttributeResourceValue(int index, int defaultValue);

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

 

分享到:
评论

相关推荐

    Android 圆形头像剪切(studio版)

    总的来说,Android Studio中的圆形头像剪切涉及到图片处理、自定义View以及用户交互等多个知识点,通过CutImageDemo项目,开发者可以更好地理解和实现这一功能。在实际项目中,可以根据需求进行优化,比如添加动画...

    Android listview和button点击事件冲突问题解决方法

    public ListButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void setPressed(boolean pressed) { if (pressed && getParent() ...

    焦点抢占问题

    在Android开发中,"焦点抢占问题"是一个常见的挑战,特别是在涉及到多层级视图组件交互时,如ListView...通过理解Android的焦点系统和事件分发机制,我们可以更有效地解决类似“焦点抢占问题”的挑战,提高用户体验。

    安卓Andriod源码——创建抗锯齿透明背景圆角图像.zip

    在Android开发中,创建具有抗锯齿效果、透明背景以及圆角的图像是一项常见的需求,尤其是在设计用户界面时。这个压缩包"安卓Andriod源码...这个源码示例对于理解和实践Android图像处理以及自定义View的使用非常有帮助。

    Android 绘制圆形头像

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); ...

    Android移植之自定义ProgressBar.doc

    构造函数内部调用`initProgressBar()`初始化进度条,并通过`context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, 0)`获取`AttributeSet`中的属性值。`R.styleable.ProgressBar`是一个在`...

    Android自定义View实现开关按钮

    需要重写三个构造方法:`ToggleView(Context context)`,`ToggleView(Context context, AttributeSet attrs)`,以及`ToggleView(Context context, AttributeSet attrs, int defStyle)`。前两个构造方法是为了支持在...

    Android-StreamList横向流式布局点击删除

    public StreamListView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutManager(new HorizontalLayoutManager(context)); } // ... 自定义...

    listview嵌套viewpager

    public TouchableWrapper(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setEnabled(boolean enabled) { this.enabled = enabled; } @Override ...

    34556-第1章和第11章(书签目录)1

    public BasisView(Context context, AttributeSet attrs, int defStyle) { ... } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 设置画笔属性 Paint paint = new Paint(); ...

    Android圆形头像,qq的头像类似,

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { Bitmap bitmap = BitmapFactory....

    Android 圆形头像实现

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { Bitmap bitmap = ...

    Gallery与其Item的Click事件冲突的解决办法

    ### Gallery与其Item的Click事件冲突的解决办法 在Android应用开发过程中,经常需要用到`Gallery`控件来实现图片轮播或者一系列卡片式的展示效果。...希望本文能帮助开发者们更好地理解和解决这类问题。

    Android自定义表格控件满足人们对视觉的需求

    自定义ViewGroup的子类需要覆盖至少一个构造函数,例如`ViewGroup(Context context)`、`ViewGroup(Context context, AttributeSet attrs)`和`ViewGroup(Context context, AttributeSet attrs, int defStyle)`。...

    Android 入门第五讲-圆形图片java文件.zip

    在Android开发中,创建圆形图片是一项常见的需求,例如在用户头像、社交应用等场景下。...同时,这也展示了Android自定义视图的基本原理和实现过程,对理解Android图形绘制和视图扩展具有重要意义。

    Android 自定义View的构造函数详细介绍

    这种写法的优点在于,所有构造函数的逻辑清晰明了,初始化工作统一在一个地方,易于维护和理解。 ### 第二种构造函数写法: 级联式调用,每个构造函数调用比它多一个参数的构造函数,直到最后一个构造函数调用基类...

    DrawerLayout去除阴影,阴影部分点击不关闭抽屉并可以触发相关view,抽屉侧滑可响应关闭

    DrawerLayout是Android开发中常用的布局组件,主要用于实现滑动抽屉效果,常见于导航菜单或者设置界面。在默认情况下,...在TestDrawerLayout这个项目中,你可以找到具体的代码示例,进一步理解和应用这些知识。

    Android自定义View构造函数详解

    在Android开发中,自定义View是提升应用个性化和功能扩展性的重要手段。为了创建一个自定义View,通常需要实现三个构造...理解并熟练运用这些构造函数和自定义属性,可以让你在开发过程中更灵活地构建个性化的UI组件。

    Android API 中文(15) —— GridView

    ### Android API 中文(15) —— GridView #### 类概述 `GridView`是一个重要的UI组件,用于在Android应用中展示一...通过对`GridView`的各种属性和方法的理解与运用,开发者可以轻松地创建出美观且功能丰富的界面。

Global site tag (gtag.js) - Google Analytics