声明样式名称如何链接到使用其属性的视图?

时间:2013-04-22 18:20:22

标签: android custom-attributes android-custom-view custom-view declare-styleable

通常,自定义属性的示例具有以下形式:

<declare-stylable name="MyView">
    <attr name="name" format="string"/>
</declare-styleable>  

及其用法:

<com.example.test.MyView
    customns:name="Hello"/>

因此自定义视图与可设置属性的名称相同。

但你看到in this example (click for full code)

<declare-styleable name="Options">
    <attr name="titleText" format="string" localization="suggested" />
    <attr name="valueColor" format="color" />
</declare-styleable>

用于:

<com.vogella.android.view.compoundview.ColorOptionsView
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    custom:titleText="Background color"
    custom:valueColor="@android:color/holo_green_light"
    />

这让我很奇怪,ColorOptionsView是如何与名称为Options定义的属性相关联的?

1 个答案:

答案 0 :(得分:1)

这些选项作为声明的namespace 自定义的一部分提供,它位于XML文件的顶部:

xmlns:custom="http://schemas.android.com/apk/res/com.vogella.android.view.compoundview"

注意

简单地添加此行不会为自动完成提供支持。如果这是您的问题的意思,则需要将架构添加到工作区的 XML目录。您可以在Eclipse中执行此操作,转到Eclipse -> Preferences,然后转到XML -> XML Catalog。在这里,单击Add...按钮。导航到XML Schema文件,然后选择OK。如果您关闭并重新打开XML文件,您现在将拥有自动完成功能。


最后,在解压缩ColorOptionsView.java中使用的属性时,作者可以专门从该命名空间中查找属性。这来自同一个来源(由我评论):

//grab the declared-styleable resource entries
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Options, 0, 0);
//get the "titleText" entry from this element's attributes
String titleText = a.getString(R.styleable.Options_titleText);
//get the "valueColor" attribute. If it does not exists, set the default to holo_blue_light
int valueColor = a.getColor(R.styleable.Options_valueColor,
    android.R.color.holo_blue_light);
a.recycle();