AndroidのPhoneGap:html <-> js <->プラグイン<->アクティビティの間に悪い情報の流れがあります
-
27-10-2019 - |
質問
私には問題があります...(本当に?:-))
私がしたいこと?
MapActivityを起動するためにネイティブプラグインを作成する必要があります(POIを表示し、旅程を表示するために...)。MapViewがいくつかの条件で閉じられたら、特定のHTMLページをロードする必要があります。
そう :
JSイベント付き.htmlページ - > .jsプラグイン - > .javaプラグイン - (起動) - > .java mapactivity
そして、私のマッパアクティビティが終了したとき:
mapactivity send [status.ok]または[メッセージ] x-> .javaプラグイン - > .jsコールバック - >新しいページの読み込み
どうしたの?
しかし、残念ながら、私はこの流れを持っています:
- > .javaプラグイン実行:{launch(mapactivity);応答を返す}
そして、私のMapActivityは起動されますが、私のコールバックはすでにデータなしで渡されています。
別の問題:PhoneGapはonactivityResult()をキャンセルしているようです。MapViewPlugin.javaでコールバックデータを取得することは不可能です
コード?
mapview.js-プラグイン
の問題 折り返し電話 これは、MapActivityが起動する前に呼び出されます。 Sleep(2000)は、MapViewが表示された後に新しいページを表示するための回避策です。しかし、それは良い問題ではありません!
MapView.prototype.showItineraryMapView = function(itineraryEncoded, startLat,
startLong, startTitle, startDesc, finishLat, finishLong, finishTitle,
finishDesc, callBack) {
PhoneGap.exec(function() {
sleep(2000);
callBack();
}, function(){} , "MapView", "show_itinerary", [ itineraryEncoded, startLat, startLong,
startTitle, startDesc, finishLat, finishLong, finishTitle,
finishDesc ]);
};
function sleep(ms) {
var dt = new Date();
dt.setTime(dt.getTime() + ms);
while (new Date().getTime() < dt.getTime());
}
mapviewplugin.java-プラグイン
@Override
public PluginResult execute(String action, JSONArray data, String callbackId)
{
Log.i("MapViewPlugin", "Début MapViewPlugin");
PluginResult result = null;
if (action.equals(ACTION_SHOW_ITINERARY))
{
Log.i("MapViewPlugin", "showItineraryMapView");
try
{
return this.showItineraryMapView(data.getString(0), data.getInt(1), data.getInt(2), data.getString(3), data.getString(4), data.getInt(5), data.getInt(6), data.getString(7), data.getString(8));
}
catch (JSONException e)
{
e.printStackTrace();
}
}
else
{
result = new PluginResult(Status.INVALID_ACTION);
Log.d("MapViewPlugin", "Invalid action : " + action + " passed");
}
return result;
}
private PluginResult showItineraryMapView(String encoded_itinerary, int startLat, int startLong, String startTitle, String startDesc, int finishLat, int finishLong, String finishTitle, String finishDesc)
{
Log.i("MapViewPlugin", "Start showMapView()");
Intent iMapView = new Intent(ctx, MapViewActivity.class);
iMapView.putExtra(MODE, MODE_ITINERARY);
iMapView.putExtra(ITINERARY_ENCODED, encoded_itinerary);
iMapView.putExtra(START_LAT, startLat);
iMapView.putExtra(START_LONG, startLong);
iMapView.putExtra(START_TITLE, startTitle);
iMapView.putExtra(START_DESC, startDesc);
iMapView.putExtra(FINISH_LAT, finishLat);
iMapView.putExtra(FINISH_LONG, finishLong);
iMapView.putExtra(FINISH_TITLE, finishTitle);
iMapView.putExtra(FINISH_DESC, finishDesc);
Log.i("MapViewPlugin", "Launching intent...");
ctx.startActivity(iMapView);
return new PluginResult(Status.OK);
}
それが良い解決策であるかどうかはわかりません。おそらく間違っているでしょう。誰かが私を助けることができますか?
これは私の最初のStackOverFlowの質問ですので、より精度が必要な場合、または私が十分に正確でない場合は、詳細をお問い合わせください。
ありがとう!
解決
まったく正しくありません。ここに、あなたを停止させるべきいくつかの変更があります。まず、実行されるCallBackIDを保存する必要があります。次に、実行メソッドでshowitinerarymapview()を呼び出しますが、pluginResultを返してもらわないでください。
showitinerarymapview()に電話をかけた直後にこれを行います。
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;
次に、showitinerarymapview()では、ctx.startactivity()の代わりにctx.startactivityforresult()を呼び出し、その後すぐに新しいpluginResultを返す行を削除します。
次に、onactivityResult()メソッドをオーバーライドする必要があります。これは、MapViewから情報を入手する場所です。その後、あなたは電話をかけることになります:
this.success(new PluginResult(PluginResult.Status.OK, myData), this.callbackId);
ここで、「mydata」はJavaScript側に渡す情報であり、「this.callbackid」は実行メソッドに保存されたコールバックIDです。