使用XML声明自定义的Android UI元素

23 浏览
0 Comments

使用XML声明自定义的Android UI元素

我如何使用XML声明Android UI元素?

admin 更改状态以发布 2023年5月21日
0
0 Comments

非常好的参考资料。谢谢!
有个补充:

如果你的项目中有一个包含为自定义视图声明自定义属性的库项目,则必须声明你的项目名称空间,而不是库的名称空间。例如:

假设库的包名为“com.example.library.customview”,而工作项目的包名为“com.example.customview”,那么:

这样无法工作(显示错误“错误:在包'com.example.library.customview'中找不到属性'newAttr'的资源标识符”):


这样可以工作:


0
0 Comments

安卓开发者指南中有一个叫做构建自定义组件的部分。不幸的是,有关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包含MyCustomViewandroid_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标签视图示例。

LabelView.java

 TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
 CharSequences=a.getString(R.styleable.LabelView_text);

attrs.xml


    
    
    

custom_view_1.xml


这个视图包含在一个LinearLayout中,有一个命名空间属性:xmlns:app="http://schemas.android.com/apk/res-auto"

链接

0