android - example - ¿Cuál es la forma recomendada de usar Google Map v2 en el fragmento?
marker android studio (2)
Puede usar MapView dentro de su Fragmento (o Actividad), esto le permitirá usar cualquier diseño que desee.
Es decir, su diseño puede verse así:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
También deberá reenviar los métodos del ciclo de vida de Fragment, como onCreate, onResume, etc., a MapView.
La única diferencia (¿parece ser un error en Google Maps?) Es que también necesita inicializar manualmente Google Maps:
private void setUpMapIfNeeded() {
if (mMap == null) {
mMap = mMapView.getMap();
if (mMap != null) {
// Thought official docs says that it is not necessary to call
// initialize() method if we got not-null GoogleMap instance from
// getMap() method it seems to be wrong in case of MapView class.
try {
MapsInitializer.initialize(getActivity());
setUpMap(mMap);
} catch (GooglePlayServicesNotAvailableException impossible) {
mMap = null;
}
}
}
}
Quiero agregar mapa dentro de fragmento con diseño personalizado.
- Puedo hacerlo usando ChildFragmentManager que agregará SupportMapFragment. Este enfoque estoy utilizando actualmente. Sin embargo, tiene una desventaja porque la transacción de fragmentos secundarios es asíncrona y es difícil garantizar que getMap no devuelva nulo.
- Otra forma es extender el mapa MapView de SupportMapFragment desde super
onCreateView
mapView = super.onCreateView(inflater, container, savedInstanceState);
e insertarlo en el diseño inflado. El problema principal es que el fragmento intenta restaurar internamente desde el estado guardado del SDK de Google Maps.
¿Hay alguna otra manera de resolver este problema? Sería fantástico si alguien del equipo de Google Map recomiende el enfoque correcto porque no ha incluido nada como esto en las muestras.
Todos los FragmentTransaction
s son asíncronos. Si desea que su transacción se realice de inmediato, tendrá que forzarlos a través de:
getChildFragmentManager().beginTransaction.add(R.id.container, new MyMapFragment(), "MyMapFragment").commit();
getChildFragmentManager().executePendingTransactions();
/* getMap() should not return null here */
Desde el sitio del desarrollador de Android :
Después de que
FragmentTransaction
se confirma conFragmentTransaction.commit()
, está programado para ejecutarse de forma asíncrona en el subproceso principal del proceso. Si desea ejecutar inmediatamente tales operaciones pendientes, puede llamar a esta función (solo desde el hilo principal) para hacerlo. Tenga en cuenta que todas las devoluciones de llamada y otros comportamientos relacionados se realizarán desde esta llamada, así que tenga cuidado con el lugar desde el que se llama.Devoluciones
Devuelve verdadero si hubiera alguna transacción pendiente por ejecutar.