次の方法で共有


列挙型の作成

Java Android ライブラリでは、整数定数を使用して、ライブラリのプロパティまたはメソッドに渡される状態を表す場合があります。 広く分散されたバインディングの場合は、これらの整数定数を C# の列挙型にバインドして、コンシューマーに優しい API を提供すると便利な場合があります。

コンシューマーは列挙体ではなくバインドされた定数を使用できるため、内部または使用率の低いバインディングの場合、通常、これらを設定する価値はありません。

このマッピングを容易にするために、既定のプロジェクト テンプレートによって、バインド プロジェクトに次の 2 つのファイルが追加されます。

  • EnumFields.xml - このファイルは、Java 整数定数と C# 列挙型の間のマッピングを定義します

  • EnumMethods.xml - このファイルでは、現在、 int メソッド パラメーターを受け取るか、 int 戻り値の型を持つメソッド/プロパティを、代わりに列挙型を使用するように変更する必要があります。

EnumFields.xmlを使用してenumを定義する

EnumFields.xml ファイルには、Java の int 定数と C# の enums の間のマッピングが含まれています。 次に、一連の int 定数に対して作成される C# の列挙型の例を見てみましょう。

<mapping jni-class="com/skobbler/ngx/map/realreach/SKRealReachSettings" clr-enum-type="Skobbler.Ngx.Map.RealReach.SKMeasurementUnit">
    <field jni-name="UNIT_SECOND" clr-name="Second" value="0" />
    <field jni-name="UNIT_METER" clr-name="Meter" value="1" />
    <field jni-name="UNIT_MILIWATT_HOURS" clr-name="MilliwattHour" value="2" />
</mapping>

ここでは、Java クラス SKRealReachSettings を使用し、名前空間 SKMeasurementUnitSkobbler.Ngx.Map.RealReach という名前の C# 列挙型を定義しました。 field エントリには、Java 定数の名前 (例: UNIT_SECOND)、列挙エントリの名前 (例: Second)、および両方のエンティティによって表される整数値 (例: 0) が定義されています。

EnumMethods.xmlを使用した getter/setter メソッドの定義

EnumMethods.xml ファイルでは、メソッドのパラメーターと戻り値の型を Java の int 定数から C# の enums に変更できます。 言い換えると、C# 列挙型 (EnumFields.xml ファイルで定義されている) の読み取りと書き込みを、Java の int 定数の getset メソッドにマップします。

上で定義されている SKRealReachSettings 列挙型を使用すると、次の EnumMethods.xml ファイルにより、この列挙型のゲッター/セッターが定義されます。

<mapping jni-class="com/skobbler/ngx/map/realreach/SKRealReachSettings">
    <method jni-name="getMeasurementUnit" parameter="return" clr-enum-type="Skobbler.Ngx.Map.RealReach.SKMeasurementUnit" />
    <method jni-name="setMeasurementUnit" parameter="measurementUnit" clr-enum-type="Skobbler.Ngx.Map.RealReach.SKMeasurementUnit" />
</mapping>

最初の method 行は、Java の getMeasurementUnit メソッドの戻り値を SKMeasurementUnit 列挙型にマップします。 2 番目の method 行は、setMeasurementUnit の最初のパラメーターを同じ列挙型にマップします。

これらの変更をすべて行った後、.NET for Android の次のコードを使用して、 MeasurementUnitを設定できます。

realReachSettings.MeasurementUnit = SKMeasurementUnit.Second;