Pregunta

Tengo un problema ... (¿en serio? :-))

¿Lo que quiero hacer?

Necesito hacer un complemento nativo para lanzar una MapActivity (para mostrar POI, mostrar itinerarios, ...), y cuando el mapView está cerrado con algunas condiciones, tengo que cargar una página HTML particular.

Asi que :

.Html página con eventos js -> .js complemento -> .java complemento -(lanzamiento) -> .java mapActivity

Y cuando mi MapActividad está terminada:

MapActivity Enviar [status.ok] o [mensaje] x-> .java complemento -> .js devolución de llamada -> cargar nueva página

¿Cuál es el problema?

Pero desafortunadamente, tengo este flujo:

-> .java complemento ejecutar: {la elunch (mapActivity); Respuesta de retorno}

Y luego se lanza mi MapActivity, pero mi devolución de llamada ya se pasa sin ningún dato.

Otro problema: PhoneGap parece cancelar el OnActivityResult (), es imposible obtener datos de devolución de llamada en MapViewPlugin.java

¿El código?

MapView.js - complemento

Problema con llamar de vuelta que se llama antes de que se lance la MapActividad. The Sleep (2000) es una solución para mostrar la nueva página después de que se muestra el MAPVIEW. ¡Pero no es un buen problema!

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 - complemento

@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);
}

No sé si es la buena solución, probablemente estoy de manera incorrecta. Alguien puede ayudarme?

Es mi primera pregunta de stackoverflow, así que si quieres más precisión o si no soy lo suficientemente preciso, pregúntame más detalles.

¡Gracias!

¿Fue útil?

Solución

No está del todo bien. Aquí hay algunos cambios que deberían despegarte. Primero deberá guardar el devocador de llamada que se pasa a ejecutar. Luego, en su método de ejecución, llame a showitineroymapView () pero no lo haga devolver un complemento que devuelva el regreso.

Inmediatamente después de hacer la llamada a showitineroymapView () hacer esto:

PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;

Luego, en showitineroymapView () desea llamar a ctx.startactivityForResult () en lugar de ctx.startactivity () y eliminar la línea inmediatamente después que devuelve un nuevo complemento.

Entonces necesitará en exceso el método OnActivityResult (). Aquí es donde obtendrá su información de MapView. Entonces terminas llamando:

this.success(new PluginResult(PluginResult.Status.OK, myData), this.callbackId);

Donde "MyData" es la información que desea transmitir al lado de JavaScript y "this.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top