原文链接: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中的圆形头像剪切涉及到图片处理、自定义View以及用户交互等多个知识点,通过CutImageDemo项目,开发者可以更好地理解和实现这一功能。在实际项目中,可以根据需求进行优化,比如添加动画...
public ListButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void setPressed(boolean pressed) { if (pressed && getParent() ...
在Android开发中,"焦点抢占问题"是一个常见的挑战,特别是在涉及到多层级视图组件交互时,如ListView...通过理解Android的焦点系统和事件分发机制,我们可以更有效地解决类似“焦点抢占问题”的挑战,提高用户体验。
在Android开发中,创建具有抗锯齿效果、透明背景以及圆角的图像是一项常见的需求,尤其是在设计用户界面时。这个压缩包"安卓Andriod源码...这个源码示例对于理解和实践Android图像处理以及自定义View的使用非常有帮助。
public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); ...
构造函数内部调用`initProgressBar()`初始化进度条,并通过`context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, 0)`获取`AttributeSet`中的属性值。`R.styleable.ProgressBar`是一个在`...
需要重写三个构造方法:`ToggleView(Context context)`,`ToggleView(Context context, AttributeSet attrs)`,以及`ToggleView(Context context, AttributeSet attrs, int defStyle)`。前两个构造方法是为了支持在...
public StreamListView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutManager(new HorizontalLayoutManager(context)); } // ... 自定义...
public TouchableWrapper(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setEnabled(boolean enabled) { this.enabled = enabled; } @Override ...
public BasisView(Context context, AttributeSet attrs, int defStyle) { ... } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 设置画笔属性 Paint paint = new Paint(); ...
public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { Bitmap bitmap = BitmapFactory....
public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { Bitmap bitmap = ...
### Gallery与其Item的Click事件冲突的解决办法 在Android应用开发过程中,经常需要用到`Gallery`控件来实现图片轮播或者一系列卡片式的展示效果。...希望本文能帮助开发者们更好地理解和解决这类问题。
自定义ViewGroup的子类需要覆盖至少一个构造函数,例如`ViewGroup(Context context)`、`ViewGroup(Context context, AttributeSet attrs)`和`ViewGroup(Context context, AttributeSet attrs, int defStyle)`。...
在Android开发中,创建圆形图片是一项常见的需求,例如在用户头像、社交应用等场景下。...同时,这也展示了Android自定义视图的基本原理和实现过程,对理解Android图形绘制和视图扩展具有重要意义。
这种写法的优点在于,所有构造函数的逻辑清晰明了,初始化工作统一在一个地方,易于维护和理解。 ### 第二种构造函数写法: 级联式调用,每个构造函数调用比它多一个参数的构造函数,直到最后一个构造函数调用基类...
DrawerLayout是Android开发中常用的布局组件,主要用于实现滑动抽屉效果,常见于导航菜单或者设置界面。在默认情况下,...在TestDrawerLayout这个项目中,你可以找到具体的代码示例,进一步理解和应用这些知识。
在Android开发中,自定义View是提升应用个性化和功能扩展性的重要手段。为了创建一个自定义View,通常需要实现三个构造...理解并熟练运用这些构造函数和自定义属性,可以让你在开发过程中更灵活地构建个性化的UI组件。
### Android API 中文(15) —— GridView #### 类概述 `GridView`是一个重要的UI组件,用于在Android应用中展示一...通过对`GridView`的各种属性和方法的理解与运用,开发者可以轻松地创建出美观且功能丰富的界面。