monodroid / xamarin自定义属性使用ObtainStyledAttributes为空

尝试将父布局的自定义属性传递给子布局。

从ObtainStyledAttributes()返回的TypedArray似乎没有我创build的自定义属性的相应的自定义值,尽pipe我可以将它们的ID映射到Resource.designer中的值。


Attr.xml:

<resources> <declare-styleable name="HeaderView"> <attr name="bgcolor" format="color" /> <attr name="testing" format="string" /> </declare-styleable> 

Main.xaml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <views.HeaderView android:id="@+id/hdrWatchList" android:layout_width="fill_parent" android:layout_height="20.0dp" custom:bgcolor="@color/blue" custom:testing="testing text buddy" /> 

查看课程:

  public HeaderView (Context context, IAttributeSet attrs) : base (context, attrs) { int[] styleAttrs = Resource.Styleable.HeaderView; TypedArray a = context.ObtainStyledAttributes(attrs, styleAttrs); string sid = a.GetString(Resource.Styleable.HeaderView_testing); int id = a.GetColor(Resource.Styleable.HeaderView_bgcolor, 555); Log.Info( "testing", "resource sid : " + sid); // RETURNS '' Log.Info( "testing", "resource id : " + id); // RETURNS DEF 555 

Solutions Collecting From Web of "monodroid / xamarin自定义属性使用ObtainStyledAttributes为空"

我认为问题在于你如何指定你的xmlns:custom命名空间。 您需要添加您的应用程序名称空间在string的末尾,您已经有这样的:

 xmlns:custom="http://schemas.android.com/apk/res/my.awesome.namespace" 

您还需要为您的Android项目定义一个AndroidManifest.xml ,并在其中定义了相同的名称空间。

另外线路:

 int[] styleAttrs = Resource.Styleable.HeaderView; TypedArray a = context.ObtainStyledAttributes(attrs, styleAttrs); 

看起来有点奇怪,我只会写:

 var a = context.ObtainStyledAttributes(attrs, Resource.Styleable.HeaderView); 

特别是如果你以后不使用styleAttrs

编辑:由于Android SDK rev 17,可以使用:

 xmlns:custom="http://schemas.android.com/apk/res-auto" 

而不必写整个命名空间。