我试图以编程方式获取自定义窗口小部件的自定义属性的值。
小部件扩展了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库项目中,正在使用它。
答案 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();