MonoDroid - 如何以编程方式获取布局中定义的窗口小部件的自定义属性值

时间:2013-01-18 10:02:51

标签: android android-widget xamarin.android

我试图以编程方式获取自定义窗口小部件的自定义属性的值。

小部件扩展了LinearLayout,我已经定义了自定义属性,如下所示:

<declare-styleable name="CustomWidget">
    <attr name="customProperty" format="string" />
</declare-styleable>

当前正试图像这样访问'customProperty'的值:

public CustomWidget(Context context, IAttributeSet attrs)
    : base(context, attrs)
{
    var a = context.ObtainStyledAttributes(attrs, Resource.Styleable.CustomWidget);
    var s = a.GetString(Resource.Styleable.CustomWidget_customProperty);
}

我也尝试过在OnFinishInflate()方法中调用此代码,但没有运气。

可能值得一提的是,这个小部件位于一个单独的android库项目中,正在使用它。

1 个答案:

答案 0 :(得分:2)

我在MonoDroid.ActionBar中工作得很好。因此,当您尝试使用自定义属性时,您可能会遇到陷阱。您必须记住在XML中声明xmlns命名空间并将其引用到应用程序的正确命名空间。

因此,假设您的命名空间为My.Awesome.App,其中包含您的CustomWidget某处,那么您的axml布局可能如下所示:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cs="http://schemas.android.com/apk/res/my.awesome.app"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <my.awesome.app.CustomWidget
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        cs:customProperty="Awesome!"
        />
</LinearLayout>

请注意,已声明了cs xmlns命名空间,并在CustomWidget中的axml声明中使用此命名空间将字符串Awesome!传递给自定义布局

现在,您应该能够在customProperty的构造函数中获得CustomWidget

//Custom Attributes (defined in Attrs.xml)
var a = context.ObtainStyledAttributes(attrs, Resource.Styleable.CustomWidget);

var awesomeProperty = a.GetString(Resource.Styleable.CustomWidget_customProperty);
if (null != awesomeProperty)
    //do something with it...

//Don't forget to recycle it
a.Recycle();