我有一个问题…(真的吗?: -)
我想做什么?
我需要做一个本地插件来启动一个MapActivity(显示POI,显示行程,…),当mapView在某些条件下关闭时,我必须加载一个特定的html页面。
:
.HTML Page with JS Events -> .JS PlugIn -> .Java PlugIn -> .Java MapActivity
当我的MapActivity完成时:
MapActivity send [Status.]ok] or [message] X-> .Java PlugIn -> .JS CallBack -> Load new page
有什么问题吗?
但不幸的是,我有这样的流程:
-> .java Plugin Execute: {Launch(MapActivity);
,然后我的mapactivity启动,但是我的回调已经通过了,没有任何数据。
另一个问题:PhoneGap似乎取消了onActivityResult(),在MapViewPlugin.java中无法获得回调数据
代码?
mapview.js Plugin
在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);
}
我不知道这是不是好的解决方案,我可能走错了路。有人能帮帮我吗?
这是我的第一个stackoverflow问题,所以如果你想要更精确,或者如果我不够精确,请问我更多的细节。
谢谢的!
不太对。这里有一些改变可以让你摆脱困境。首先,您需要保存传递给execute的callbackId。然后在你的execute方法中调用showItineraryMapView(),但不要让它返回PluginResult,让它返回void。
在调用showItineraryMapView()之后立即执行以下操作:
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;
然后在showItineraryMapView()中,你想调用ctx.startActivityForResult()而不是ctx.startActivity(),并删除之后立即返回新的PluginResult的行。
那么你需要重写onActivityResult()方法。这是你从MapView获取信息的地方。然后调用:
this.success(new PluginResult(PluginResult.Status.OK, myData), this.callbackId);
,其中"myData"是你想传递回JavaScript端的信息,而"this"是你想传递回JavaScript端的信息。