使用XML声明自定义的Android UI元素
安卓开发者指南中有一个叫做构建自定义组件的部分。不幸的是,有关XML属性的讨论仅涵盖了在布局文件中声明控件并未真正处理类初始化中的值的内容。步骤如下:
1. 在values\attrs.xml
中声明属性
注意declare-styleable
标签中使用了未经资格证明的名称。非标准的安卓属性如extraInformation
需要声明其类型。在父类中声明的标签将在子类中可用,无需重新声明。
2. 创建构造函数
由于有两个使用AttributeSet
初始化的构造函数,为构造函数创建一个单独的初始化方法比较方便。
private void init(AttributeSet attrs) { TypedArray a=getContext().obtainStyledAttributes( attrs, R.styleable.MyCustomView); //Use a Log.i("test",a.getString( R.styleable.MyCustomView_android_text)); Log.i("test",""+a.getColor( R.styleable.MyCustomView_android_textColor, Color.BLACK)); Log.i("test",a.getString( R.styleable.MyCustomView_extraInformation)); //Don't forget this a.recycle(); }
R.styleable.MyCustomView
是一个自动生成的int[]
资源,其中每个元素都是一个属性的ID。在XML中,每个属性为一个属性名称添加到元素名称中生成。例如,R.styleable.MyCustomView_android_text
包含MyCustomView
的android_text
属性。可以使用各种get
函数从TypedArray
中检索属性。如果在XML中未定义属性,则返回null
。当然,如果返回类型是原始类型,则返回第二个参数。
如果不想检索所有属性,可以手动创建此数组。标准 Android 属性的 ID 包含在android.R.attr
中,而此项目的属性位于R.attr
中。
int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};
请注意,您不应使用android.R.styleable
中的任何内容,因为根据此线程,它可能会在将来更改。它仍在文档中,因为在一个地方查看所有这些常量很有用。
3. 在布局文件(例如layout\main.xml
)中使用它
在顶层 xml 元素中包含名称空间声明xmlns:app="http://schemas.android.com/apk/res-auto"
。名称空间提供了一种避免不同模式使用相同元素名称时可能发生的冲突的方法(有关更多信息,请参见本文)。该 URL 只是一种唯一标识模式的方式 - 实际上没有任何东西需要托管在该 URL 上。如果这看起来没有做任何事情,那是因为您实际上不需要添加名称空间前缀,除非您需要解决冲突。
使用完全限定名称引用自定义视图。
Android LabelView示例
如果你想要一个完整的示例,请查看Android标签视图示例。
TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView); CharSequences=a.getString(R.styleable.LabelView_text);
这个视图包含在一个LinearLayout
中,有一个命名空间属性:xmlns:app="http://schemas.android.com/apk/res-auto"