Xamarin Android 绑定 class FooInvoker 没有实现接口 setter
Xamarin Android binding class FooInvoker does not implement interface setter
我有一个毫无意义的 Xamarin Android 绑定错误!
生成的 class 存根是:
[global::Android.Runtime.Register ("com/scichart/drawing/common/IRenderSurface", DoNotGenerateAcw=true)]
internal class IRenderSurfaceInvoker : global::Java.Lang.Object, IRenderSurface
[Register ("com/scichart/drawing/common/IRenderSurface", "", "Com.Scichart.Drawing.Common.IRenderSurfaceInvoker")]
public partial interface IRenderSurface : global::Com.Scichart.Core.Framework.IInvalidatableElement, global::Com.Scichart.Core.Framework.IView { }
// Metadata.xml XPath interface reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']"
[Register ("com/scichart/core/framework/IView", "", "Com.Scichart.Core.Framework.IViewInvoker")]
public partial interface IView : global::Com.Scichart.Core.Framework.IContextProvider, global::Com.Scichart.Core.Framework.IHitTestable
{
int Visibility
{
// Metadata.xml XPath method reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='getVisibility' and count(parameter)=0]"
[Register ("getVisibility", "()I", "GetGetVisibilityHandler:Com.Scichart.Core.Framework.IViewInvoker, SciChart.Android.Core")] get;
// Metadata.xml XPath method reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='setVisibility' and count(parameter)=1 and parameter[1][@type='int']]"
[Register ("setVisibility", "(I)V", "GetSetVisibility_IHandler:Com.Scichart.Core.Framework.IViewInvoker, SciChart.Android.Core")] set;
}
}
发生的事情是 IView.Visibility(具有 get、set)与基数 class Android.View.Visibility 冲突。我已经解决了 additions 文件夹中的冲突,但是有这个 IRenderSurfaceInvoker class 是生成的,而不是部分的,并且没有正确实现 IView 接口。
通常我会忽略 metadata.xml 中的 属性 并在部分 class 中手动创建它,但这是不可能的,因为 IRenderSurfaceInvoker 不是部分的。
到底什么是 FooInvoker??!
有什么想法吗? :)
编辑:更新
在下面 Sven-Michael Stube 的回答之后,我有了这个部分解决方案:
<!-- In EnumMethods.xml -->
<mapping jni-interface="com/scichart/core/framework/IView">
<method jni-name="getVisibility" parameter="return" clr-enum-type="Android.Views.ViewStates" />
<method jni-name="setVisibility" parameter="visibility" clr-enum-type="Android.Views.ViewStates" />
</mapping>
但是这样生成的IView界面如下:
global::Android.Views.ViewStates Visibility {
// Metadata.xml XPath method reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='getVisibility' and count(parameter)=0]"
[Register ("getVisibility", "()I", "GetGetVisibilityHandler:Com.Scichart.Core.Framework.IViewInvoker, SciChart.Android.Core")] get;
}
和警告输出
<attr path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='setVisibility']/parameter[@name='visibility']"/> matched no nodes
换句话说,上面的 EnumMethods.xml 声明删除了 setter,因为它找不到匹配项。
我该如何调试它?
我认为您不必解决 View
与 IView
的问题。您应该将 getter 的 return 值和 setter 的参数覆盖为 EnumMethods.xml 中的 Android.Views.ViewStates
.如果您坚持这样做,可能 解决您的问题。
<mapping jni-interface="com/scichart/core/framework/IView">
<method jni-name="getVisibility" parameter="return" clr-enum-type="Android.Views.ViewStates" />
<method jni-name="setVisibility" parameter="p0" clr-enum-type="Android.Views.ViewStates" />
</mapping>
我有一个毫无意义的 Xamarin Android 绑定错误!
生成的 class 存根是:
[global::Android.Runtime.Register ("com/scichart/drawing/common/IRenderSurface", DoNotGenerateAcw=true)]
internal class IRenderSurfaceInvoker : global::Java.Lang.Object, IRenderSurface
[Register ("com/scichart/drawing/common/IRenderSurface", "", "Com.Scichart.Drawing.Common.IRenderSurfaceInvoker")]
public partial interface IRenderSurface : global::Com.Scichart.Core.Framework.IInvalidatableElement, global::Com.Scichart.Core.Framework.IView { }
// Metadata.xml XPath interface reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']"
[Register ("com/scichart/core/framework/IView", "", "Com.Scichart.Core.Framework.IViewInvoker")]
public partial interface IView : global::Com.Scichart.Core.Framework.IContextProvider, global::Com.Scichart.Core.Framework.IHitTestable
{
int Visibility
{
// Metadata.xml XPath method reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='getVisibility' and count(parameter)=0]"
[Register ("getVisibility", "()I", "GetGetVisibilityHandler:Com.Scichart.Core.Framework.IViewInvoker, SciChart.Android.Core")] get;
// Metadata.xml XPath method reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='setVisibility' and count(parameter)=1 and parameter[1][@type='int']]"
[Register ("setVisibility", "(I)V", "GetSetVisibility_IHandler:Com.Scichart.Core.Framework.IViewInvoker, SciChart.Android.Core")] set;
}
}
发生的事情是 IView.Visibility(具有 get、set)与基数 class Android.View.Visibility 冲突。我已经解决了 additions 文件夹中的冲突,但是有这个 IRenderSurfaceInvoker class 是生成的,而不是部分的,并且没有正确实现 IView 接口。
通常我会忽略 metadata.xml 中的 属性 并在部分 class 中手动创建它,但这是不可能的,因为 IRenderSurfaceInvoker 不是部分的。
到底什么是 FooInvoker??!
有什么想法吗? :)
编辑:更新
在下面 Sven-Michael Stube 的回答之后,我有了这个部分解决方案:
<!-- In EnumMethods.xml -->
<mapping jni-interface="com/scichart/core/framework/IView">
<method jni-name="getVisibility" parameter="return" clr-enum-type="Android.Views.ViewStates" />
<method jni-name="setVisibility" parameter="visibility" clr-enum-type="Android.Views.ViewStates" />
</mapping>
但是这样生成的IView界面如下:
global::Android.Views.ViewStates Visibility {
// Metadata.xml XPath method reference: path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='getVisibility' and count(parameter)=0]"
[Register ("getVisibility", "()I", "GetGetVisibilityHandler:Com.Scichart.Core.Framework.IViewInvoker, SciChart.Android.Core")] get;
}
和警告输出
<attr path="/api/package[@name='com.scichart.core.framework']/interface[@name='IView']/method[@name='setVisibility']/parameter[@name='visibility']"/> matched no nodes
换句话说,上面的 EnumMethods.xml 声明删除了 setter,因为它找不到匹配项。
我该如何调试它?
我认为您不必解决 View
与 IView
的问题。您应该将 getter 的 return 值和 setter 的参数覆盖为 EnumMethods.xml 中的 Android.Views.ViewStates
.如果您坚持这样做,可能 解决您的问题。
<mapping jni-interface="com/scichart/core/framework/IView">
<method jni-name="getVisibility" parameter="return" clr-enum-type="Android.Views.ViewStates" />
<method jni-name="setVisibility" parameter="p0" clr-enum-type="Android.Views.ViewStates" />
</mapping>