2015-04-11 3 views
0

Lors de l'utilisation de projets de liaison Xamarin et Java, le projet de liaison résultant suit naturellement le style de codage Java. C'est à dire. attendre l'utilisation de classes anonymes (pour implémenter des interfaces de rappel simples) en tant que paramètres. Voici un exemple du code java:Comment interagir avec des méthodes qui prennent des interfaces simples en tant que paramètres dans un SDK de liaison Java fermé?

// Field 
private Player mPlayer; 

SDKClass.staticMethod(oneObject, anotherObject, new InitializationObserver() { 
    @Override 
    public void onInitialized(SomeClass someClass) { 
     // Calls mPlayer 
    } 

    @Override 
    public void OnError (Java.Lang.Throwable Error) 
    { 
     Console.WriteLine("Error in initialization: " + Error.Message); 

    } 
} 

Le code C# résultant attendent également un InitializationObserver comme le troisième paramètre. Toutefois, étant donné que le SDK est fermé et que je ne parviens pas à modifier l'implémentation, la seule façon de le faire consiste à implémenter l'interface et ses méthodes "override" dans une classe interne. Cela me semble très peu pratique.

En Java, je peux accéder à des membres non statiques de la classe anonyme (par exemple le champ mPlayer), mais cela n'est pas possible en C#.

Existe-t-il une autre approche pour créer des projets de liaison Java dans Xamarin? Existe-t-il une meilleure façon de gérer les classes générées?

Merci de votre aide. Fred

Répondre

0

Je crois qu'il n'y a pas d'autre moyen que d'ajouter un champ Player dans votre implémentation InitializationObserver et de le passer en paramètre constructeur (c'est ce que java fait derrière la scène pour les classes anonymes). Parfois, lorsque vous avez besoin d'une seule méthode, vous pouvez implémenter wrapper ou une méthode d'extension (par exemple des méthodes) et utiliser lambda et la fermeture de champ pour passer l'implémentation à l'implémentation de l'interface java.