2016-11-03 14 views
5

Mam problem z EnumMethods.xml. Używam go dla niektórych interfejsów, a odwzorowania this działają zgodnie z oczekiwaniami. Ale jeśli mam inny interfejs, który rozciąga oryginalny jeden, odwzorowania nie działa i pojawia się następujący błąd:Xamarin.Android wiążące definiujące metody Getter/Setter przy użyciu EnumMethods.xml dla interfejsu

"Cannot implicitly convert type 'int' to 'MyEnum'. An explicit conversion exists (are you missing a cast?)"

i

"Cannot implicitly convert type 'MyEnum' to 'int'. An explicit conversion exists (are you missing a cast?)"

Czy istnieje sugestia, dlaczego?

mapowania wygląda następująco:

<mapping jni-interface="path/IView"> 
 
    <method jni-name="getSmth" parameter="return" clr-enum-type="MyEnum" /> 
 
    <method jni-name="setSmth" parameter="param" clr-enum-type="MyEnum" /> 
 
</mapping>

EDIT

Aby wyjaśnić. Powiedzmy, że drugi nazywa się IViewInheritor. Tak więc powyższe błędy znajdują się wewnątrz klasy IViewInheritorInvoker. Mam mapowanie również dla tej klasy.

<mapping jni-interface="path/IViewInheritor"> 
    <method jni-name="getSmth" parameter="return" clr-enum-type="MyEnum" /> 
    <method jni-name="setSmth" parameter="param" clr-enum-type="MyEnum" /> 
</mapping> 

attached bindings project

+0

Spróbuj podać 'jni-interface' zamiast' jni-class' dla innego odwzorowania. –

+0

Obie używały interfejsu jni. Właśnie zaktualizowałem pytanie – nrudnyk

+0

Czy dodałeś jeszcze jeden dla danego interfejsu? –

Odpowiedz

2

Najpierw rzućmy okiem na definicji Core.IViewapi.xml:

<interface abstract="true" deprecated="not deprecated" final="false" name="IView" static="false" visibility="public"> 
<method abstract="true" deprecated="not deprecated" final="false" name="getVisibility" native="false" return="int" static="false" synchronized="false" visibility="public"> 
</method> 
<method abstract="true" deprecated="not deprecated" final="false" name="setVisibility" native="false" return="void" static="false" synchronized="false" visibility="public"> 
<parameter name="p0" type="int"> 
</parameter> 
</method> 
</interface> 

Ok wielkie, widzimy dokładnie nazwy parametrów i typów zwracanych.

1>BINDINGSGENERATOR : warning : [Interface] dom.core.IView in [Method] void setVisibility(int p0) has 'unnamed' parameters 

1>BINDINGSGENERATOR : warning BG8A04: <attr path="/api/package[@name='dom.core']/interface[@name='IView']/method[@name='setVisibility']/parameter[@name='visibility']"/> matched no nodes. 

Więc musimy zmienić nazwę parametru, żeby p0 w EnumMethods.xml projektu Core.

Wtedy możemy zobaczyć różnicę:

iVIEW:

static Delegate cb_getVisibility; 
#pragma warning disable 0169 
     static Delegate GetGetVisibilityHandler() 
     { 
      if (cb_getVisibility == null) 
       cb_getVisibility = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_GetVisibility); 
      return cb_getVisibility; 
     } 

     static int n_GetVisibility (IntPtr jnienv, IntPtr native__this) 
     { 
      global::Dom.Core.IView __this = global::Java.Lang.Object.GetObject<global::Dom.Core.IView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer); 
      return (int) __this.Visibility; 
     } 
#pragma warning restore 0169 

     static Delegate cb_setVisibility_I; 
#pragma warning disable 0169 
     static Delegate GetSetVisibility_IHandler() 
     { 
      if (cb_setVisibility_I == null) 
       cb_setVisibility_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_SetVisibility_I); 
      return cb_setVisibility_I; 
     } 

     static void n_SetVisibility_I (IntPtr jnienv, IntPtr native__this, int native_p0) 
     { 
      global::Dom.Core.IView __this = global::Java.Lang.Object.GetObject<global::Dom.Core.IView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer); 
      global::Android.Views.ViewStates p0 = (global::Android.Views.ViewStates) native_p0; 
      __this.Visibility = p0; 
     } 
#pragma warning restore 0169 

     IntPtr id_getVisibility; 
     IntPtr id_setVisibility_I; 
     public unsafe global::Android.Views.ViewStates Visibility { 
      get { 
       if (id_getVisibility == IntPtr.Zero) 
        id_getVisibility = JNIEnv.GetMethodID (class_ref, "getVisibility", "()I"); 
       return (global::Android.Views.ViewStates) JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getVisibility); 
      } 
      set { 
       if (id_setVisibility_I == IntPtr.Zero) 
        id_setVisibility_I = JNIEnv.GetMethodID (class_ref, "setVisibility", "(I)V"); 
       JValue* __args = stackalloc JValue [1]; 
       __args [0] = new JValue ((int) value); 
       JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_setVisibility_I, __args); 
      } 
     } 

ICustomView:

static Delegate cb_getVisibility; 
#pragma warning disable 0169 
     static Delegate GetGetVisibilityHandler() 
     { 
      if (cb_getVisibility == null) 
       cb_getVisibility = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_GetVisibility); 
      return cb_getVisibility; 
     } 

     static int n_GetVisibility (IntPtr jnienv, IntPtr native__this) 
     { 
      global::Dom.Common.ICustomView __this = global::Java.Lang.Object.GetObject<global::Dom.Common.ICustomView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer); 
      return __this.Visibility; 
     } 
#pragma warning restore 0169 

     static Delegate cb_setVisibility_I; 
#pragma warning disable 0169 
     static Delegate GetSetVisibility_IHandler() 
     { 
      if (cb_setVisibility_I == null) 
       cb_setVisibility_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_SetVisibility_I); 
      return cb_setVisibility_I; 
     } 

     static void n_SetVisibility_I (IntPtr jnienv, IntPtr native__this, int native_value) 
     { 
      global::Dom.Common.ICustomView __this = global::Java.Lang.Object.GetObject<global::Dom.Common.ICustomView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer); 
      global::Android.Views.ViewStates value = (global::Android.Views.ViewStates) native_value; 
      __this.Visibility = value; 
     } 
#pragma warning restore 0169 

     IntPtr id_getVisibility; 
     IntPtr id_setVisibility_I; 
     public unsafe global::Android.Views.ViewStates Visibility { 
      get { 
       if (id_getVisibility == IntPtr.Zero) 
        id_getVisibility = JNIEnv.GetMethodID (class_ref, "getVisibility", "()I"); 
       return JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getVisibility); 
      } 
      set { 
       if (id_setVisibility_I == IntPtr.Zero) 
        id_setVisibility_I = JNIEnv.GetMethodID (class_ref, "setVisibility", "(I)V"); 
       JValue* __args = stackalloc JValue [1]; 
       __args [0] = new JValue ((int) value); 
       JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_setVisibility_I, __args); 
      } 
     } 

Widzimy, że w ICustomView istnieje kilka brakujących odlewów:

(global::Android.Views.ViewStates) and (int) 

W szczególności w metodach n_SetVisibility_I i n_GetVisibility z szacunkiem.

+0

oh, widzę ten parametr, dziękuję. Ale teraz pojawia się kolejne ostrzeżenie: "[Interfejs] dom.core.IView w [Metoda] void setVisibility (int p0) ma parametry" bez nazwy "" Czy to z powodu p0? Odnośnie obsady, czy istnieje sposób, aby to pominąć? Mam na myśli rzucanie ręczne po wygenerowaniu kodu, który byłby pita. – nrudnyk

+0

Czy są jakieś pomysły na rozwiązanie tych problemów z castingiem? – nrudnyk

Powiązane problemy