在Android UI中创建自定义XML小部件
Android开发者指南有一个名为“构建自定义组件”的章节。不幸的是,关于XML属性的讨论只覆盖了在布局文件中声明控件,而不是在类初始化中实际处理值。步骤如下:
1.在Values \ attrs.xml
中声明属性
请注意,在declare-styleable
标记中使用非限定名称。非标准android属性(如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"