Bindings
Removing Types
It is possible to instruct the Xamarin.Android Bindings Generator to ignore a Java type and not bind it. This is done by adding a remove-node
XML element to the metadata.xml file:
<remove-node path="/api/package[@name='{package_name}']/class[@name='{name}']" />
Implementing Java interfaces
If a java library contains interfaces that should be implemented by the user (e.g. click listeners like View.IOnClickListener
or callbacks), the implementing class has to inherit — directly or indirectly — from Java.Lang.Object
or Java.Lang.Throwable
. This is a common error, because the packaging steps just print a warning that is overlooked easily:
Type ‘MyListener ’ implements Android.Runtime.IJavaObject but does not inherit from Java.Lang.Object. It is not supported.
Wrong
The usage of this implementation will result in unexpected behavior.
class MyListener : View.IOnClickListener
{
public IntPtr Handle { get; }
public void Dispose()
{
}
public void OnClick(View v)
{
// ...
}
}
Correct
class MyListener :
Java.Lang.Object, // this is the important part
View.IOnClickListener
{
public void OnClick(View v)
{
// ...
}
}
Bindings libraries may rename methods and interfaces
Not everything in a bindings library will have the same name in C# as it does in Java.
In C#, interface names start with “I”, but Java has no such convention. When you import a Java library, an interface named SomeInterface
will become ISomeInterface
.
Similarly, Java doesn’t have properties like C# does. When a library is bound, Java getter and setter methods might be refactored as properties. For example, the following Java code
public int getX() { return someInt; }
public int setX(int someInt) { this.someInt = someInt; }
may be refactored as
public int X { get; set; }
when it’s bound.