在Android UI中创建自定义XML小部件

23 浏览
0 Comments

在Android UI中创建自定义XML小部件

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

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

很好的参考。谢谢!

另外一个补充:

如果你遇到了一个库项目,其中声明了用于自定义视图的自定义属性,那么你必须声明你的项目命名空间,而不是库的命名空间。例如:

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

这不会生效(显示错误“错误:在包 'com.example.library.customview' 中找不到属性'newAttr'的资源标识符”):


但是,这个是可以生效的:


0
0 Comments

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标签视图示例。

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