通知を自動的にフェードインおよびフェードアウトする GeneXus の msg メソッドを模倣するとします。
GeneXus 内で
ネイティブ外部オブジェクトを作成できます。呼び出したいメソッドおよびプロパティを公開し、実装して Android プラットフォームと統合します。
ここでは、
Android プラットフォーム用の外部オブジェクトを作成する手順について見ていきます。
Android プラットフォーム用の
Toast 通知を使用します。これにより、short および long toast の送信が可能です。
ここでは、GeneXus でこの機能を追加するために従う必要のある手順について見ていきます。
- 外部オブジェクトを作成します。これは GeneXus 内の定義であり、オブジェクトでは定義されているプロパティ、メソッド、イベントを呼び出します。
- 対象プラットフォーム (この場合は Android) に必要なコードを実装する拡張ライブラリを作成します。
MyApi と呼ばれる新しい
ネイティブ外部オブジェクトを作成します。次のプロパティ値を必ず設定してください:
Android External name |
MyApi |
External Package Name |
com.example.samplemodule1 |
1 - この値は、ライブラリに使用する名前に応じて変わる可能性があります。この例では、
既存のサンプルにコンポーネントを追加します。
ShortToast と呼ばれる新しい
メソッドを、次の値とともに追加します:
Is Static |
True |
External Member Type |
Instance |
文字
パラメーターには次を使用します:
Access Type |
In |
Type |
VarChar、長さ: 128 |
同じパラメーターを持つ、
LongToast と呼ばれる 2 つ目の
メソッドを追加します。次の図のような結果になります:
これで GeneXus 側で必要な宣言は完了です。
外部オブジェクトを保存したら、次の構文で使用できます:
MyApi.ShortToast("Hello Toast!")MyApi.LongToast(&myMessage)
ここで、この外部オブジェクトを動作させるために、いくつかの実装を行う必要があります。
次のステップでは、
拡張ライブラリに
MyApi クラスを実装します。新規で始めたい場合は、
この記事を参照してください。
新しいクラス
MyApi.java をパッケージ
com.example.samplemodule に作成します:
package com.example.samplemodule;
import android.support.annotation.NonNull;
import android.widget.Toast;
import com.artech.base.services.Services;
import com.artech.externalapi.ExternalApi;
import com.artech.externalapi.ExternalApiResult;
import java.util.List;
public class MyApi extends ExternalApi
{
// GeneXus API オブジェクト名
final static String NAME = "MyApi";
// API メソッド名
private static final String METHOD_SHORT_TOAST = "shortToast";
private static final String METHOD_LONG_TOAST = "longToast";
public MyApi(ApiAction action) {
addMethodHandler(METHOD_SHORT_TOAST, 1, mShortToast);
addMethodHandler(METHOD_LONG_TOAST, 1, mLongToast);
}
@SuppressWarnings("FieldCanBeLocal")
private final IMethodInvoker mShortToast = new IMethodInvoker() {
@Override
public @NonNull ExternalApiResult invoke(List<Object> parameters) {
final String parValue = (String) parameters.get(0);
sendToast(parValue,Toast.LENGTH_SHORT);
return ExternalApiResult.SUCCESS_CONTINUE;
}
};
@SuppressWarnings("FieldCanBeLocal")
private final IMethodInvoker mLongToast = new IMethodInvoker() {
@Override
public @NonNull ExternalApiResult invoke(List<Object> parameters) {
final String parValue = (String) parameters.get(0);
sendToast(parValue,Toast.LENGTH_LONG);
return ExternalApiResult.SUCCESS_CONTINUE;
}
};
private void sendToast(final String value, final int duration)
{
Services.Log.debug(NAME,"Toast:'"+value+"' duration:"+duration); //$NON-NLS-1$
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(),value,duration).show();
}
});
}
}
クラスコンストラクターにメソッドハンドラーを宣言します。次のメソッドを使用できます:
- addSimpleMethodHandler
- addMethodHandler
- addMethodHandlerRequestingPermissions
この例では addMethodHandler を使用します:
addMethodHandler(METHOD_SHORT_TOAST, 1, mShortToast);
addMethodHandler(METHOD_LONG_TOAST, 1, mLongToast);
次に、invoke メソッドを定義し、実装の詳細を指定します。このメソッドは、この例では
mShortToast と
mLongToast の各ハンドラーに必要です:
@SuppressWarnings("FieldCanBeLocal")
private final IMethodInvoker mShortToast = new IMethodInvoker() {
@Override
public @NonNull ExternalApiResult invoke(List<Object> parameters) {
final String parValue = (String) parameters.get(0);
sendToast(parValue,Toast.LENGTH_SHORT);
return ExternalApiResult.SUCCESS_CONTINUE;
}
};
詳細については、
この記事を参照してください。
invoke メソッドのメソッド引数は次のとおりです:
- parameters: GeneXus 外部オブジェクトで定義されているパラメーターのリストです。
開発者は、メソッドのパラメーターリストを取得し、必要なキャストを行って、機能を実装するコードに委任する必要があります。基本データタイプの引数を使用する場合、toString メソッドを使用して String パラメーターのリストを取得できます:
final String parValue = (String) parameters.get(0);
この場合、SDT または SDT コレクションオブジェクトを使用していると、Entity または EntityList (パッケージ com.artech.base.model) にキャストする必要があります。
Toast サンプルとの関係で、外部オブジェクトは、文字列引数を使用して
ShortToast および
LongToast メソッドを定義します。
MyApi.ShortToast("Hello Toast!") の実行時には、次のコードが実際に実行されます:
private void sendToast(final String value, final int duration)
{
Services.Log.debug(NAME,"Toast:'"+value+"' duration:"+duration); //$NON-NLS-1$
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(),value,duration).show();
}
});
}
Value 変数は値 "Hello Toast!"、
duration パラメーターは、実行する Toast タイプ (Short または Long) になります。最終結果は次のようになります:
外部オブジェクトを初期化し、Module クラスから
initialize メソッドを見つけ、以下を追加します:
ExternalApiDefinition mAPI = new ExternalApiDefinition(
MyApi.NAME,
MyApi.class
);
この場合、
SampleModule.java を使用しているのは、クラスを
AndroidExtensionSample から再利用し、.library ファイルで定義されている \Android\ModuleClass タグ内で定義しているからです。
<ModuleClass>com.example.samplemodule.SampleModule</ModuleClass>
GENEXUS_HOME\Libraries\SampleLibrary\SampleLibrary.library ファイルを探し、外部オブジェクトの新しい値を
Implements タグの下に追加します。
<Implements>
...<ExternalObject name="MyApi"/>
...</Implements>
これで実装セクションは完了です。
Android モジュールの場所から次のコマンドを実行します:
gradlew uploadArchives
プロセスが完了すると、ライブラリがコンパイルされ、次の Android コンパイルに含まれるように GENEXUS_HOME\Android\m2Repository にコピーされます。正常なビルドは次のようになります:
>gradlew uploadArchives
:library:androidSourcesJar
...:library:compileReleaseJavaWithJavac
Incremental compilation of X classes completed in Y secs.... :library:bundleRelease :library:publishDebugPublicationToLocalRepository BUILD SUCCESSFUL
以上です。Android
MyApi 外部オブジェクトをテストする準備ができました。
拡張ポイントを使用すると、
Knowledge Base Navigator ユーティリティは、定義済みの拡張ポイントを通じて追加されるプラットフォーム特有のコードが含まれていないため、有効なオプションではなくなります。この場合、代わりに APK ファイルを使用します。
オフラインプロシージャーから外部オブジェクトを呼び出す場合、いくつかの条件を考慮する必要があります。
この記事は、GeneXus 15 Upgrade 3 以降のバージョンが対象です。
基本的なトラブルシューティングを行うために、拡張ポイントにログメッセージを追加できます。たとえば、External Object メソッドの呼び出しをログに記録するために Execute メソッドに次の行を追加できます:
android.util.Log.v("GeneXusApplication", "MyApi::"+method);
または、パッケージ com.artech.base.services.Services の GeneXus ヘルパークラス
Services.Log を使用できます。
Services.Log.debug("GeneXusApplication", "MyApi::"+method); //$NON-NLS-1$
結果については、
Android ログシステムをチェックします。次と似たような結果が表示されるはずです:
V/GeneXusApplication(ProcessID): MyApi::ShortToast
GeneXus インストールに外部オブジェクトをデプロイするには:
- 次の環境変数が設定されていることを確認します。設定されていない場合、プロジェクトはコンパイルできません。
- GENEXUS_HOME (Genexus のインストールディレクトリー)
- ANDROID_HOME (Android SDK ディレクトリー)
- Android 拡張ライブラリの場所 (この例では SampleModule) から gradlew uploadArchives コマンドを実行します。
- ライブラリファイルを GENEXUS_HOME\Libraries\LibraryName\ folder にコピーします。これで MyAPI 外部オブジェクトの情報が追加されます。
- 外部オブジェクト定義とともに xpz をインポートし、使用します。
- スマート デバイス オブジェクトをリビルドします。