3

我正在尝试以编程方式获取自定义小部件的自定义属性的值。

小部件扩展了 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 库项目中,而不是它正在使用的那个。

4

1 回答 1

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();
于 2013-01-18T11:51:04.567 回答