2

問題が発生しました... (本当ですか? :-) )

私がしたいこと?

MapActivity を起動するためのネイティブ プラグインを作成する必要があり (POI の表示、旅程の表示など)、mapView がいくつかの条件で閉じられたときに、特定の html ページをロードする必要があります。

そう :

JS イベントを含む .HTML ページ -> .JS プラグイン -> .Java プラグイン -(起動) -> .Java MapActivity

そして、私の MapActivity が終了したら:

MapActivity send [Status.ok] or [message] X-> .Java PlugIn -> .JS CallBack -> Load new page

どうしたの?

しかし、残念ながら、私はこの流れを持っています:

-> .java プラグイン実行: { Launch(MapActivity); 応答を返します}

その後、マップアクティビティが起動されますが、コールバックはすでにデータなしで渡されています。

別の問題: PhoneGap は onActivityResult() をキャンセルしているようで、MapViewPlugin.java でコールバック データを取得することは不可能です。

コード?

mapview.js - プラグイン

MapActivity が起動される前に呼び出されるcallBackの問題。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);
}

それが良い解決策かどうかはわかりませんが、おそらく間違った方法をとっています。誰でも私を助けることができますか?

これは私の最初のスタック オーバーフローの質問です。より精度が必要な場合、または十分に正確でない場合は、詳細を尋ねてください。

ありがとう!

4

1 に答える 1

5

それは完全に正しくありません。ここにあなたが動けなくなるはずのいくつかの変更があります。まず、executeに渡されるcallbackIdを保存する必要があります。次に、executeメソッドでshowItineraryMapView()を呼び出しますが、PluginResultを返さないようにしてください。voidを返します。

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」はexecuteメソッドに保存したコールバックIDです。

于 2011-12-01T18:39:47.987 に答える