Estimado pruebe algo como esto, el android view es nombre de la vista donde va ir el mapa fragment.
B4X:
Sub Globals
Dim mFragment As MapFragment
Dim gmap As GoogleMap
Dim MapPanel As Panel
End Sub
Sub Activity_Create(FirstTime As Boolean)
MapPanel.Initialize("")
Activity.AddView(MapPanel, 0, 0, 100%x, 100%y)
If mFragment.IsGooglePlayServicesAvailable = False Then
ToastMessageShow("Google Play services not available.", True)
Else
mFragment.Initialize("Map", MapPanel)
End If
End Sub
Sub Map_Ready
Log("map ready")
gmap = mFragment.GetMap
If gmap.IsInitialized = False Then
ToastMessageShow("Error initializing map.", True)
Else
gmap.AddMarker(36, 15, "Hello!!!")
Dim cp As CameraPosition
cp.Initialize(36, 15, gmap.CameraPosition.Zoom)
gmap.AnimateCamera(cp)
End If
End Sub
No consigo hacerlo. De hecho era lo que habia probado porque quiero meterlo en un panel para poder activarlo o desactivarlo.
He intentado la idea que propones adaptandola a mi aplicacion y no va, pero para probar he copiado tal cual el codigo y he adaptado mi aplicacion al mismo y tampoco.
Por ahora lo que estoy haciendo es cargar el MapFragment en un LoadLayout y asi funciona todo. Pero no puedo hacerlo directamente. Voy a ver si encuentro un codigo donde este hecho sin el designer.
No consigo hacerlo. De hecho era lo que habia probado porque quiero meterlo en un panel para poder activarlo o desactivarlo.
He intentado la idea que propones adaptandola a mi aplicacion y no va, pero para probar he copiado tal cual el codigo y he adaptado mi aplicacion al mismo y tampoco.
Por ahora lo que estoy haciendo es cargar el MapFragment en un LoadLayout y asi funciona todo. Pero no puedo hacerlo directamente. Voy a ver si encuentro un codigo donde este hecho sin el designer.
No consigo hacerlo. De hecho era lo que habia probado porque quiero meterlo en un panel para poder activarlo o desactivarlo.
He intentado la idea que propones adaptandola a mi aplicacion y no va, pero para probar he copiado tal cual el codigo y he adaptado mi aplicacion al mismo y tampoco.
Por ahora lo que estoy haciendo es cargar el MapFragment en un LoadLayout y asi funciona todo. Pero no puedo hacerlo directamente. Voy a ver si encuentro un codigo donde este hecho sin el designer.
También puedes probar usando este código, remplazarlo por el otro
B4X:
Sub Map_Ready
gmap = mFragment.GetMap
gmap.MapType = gmap.MAP_TYPE_HYBRID
gmap.MyLocationEnabled = True
Dim cp As CameraPosition
cp.Initialize(36, 15, 15)
gmap.AnimateCamera(cp)
Dim m1 As Marker = gmap.AddMarker(36, 15, "Ubicación")
m1.Snippet = "Prueba mapa"
End Sub
No tengo problemas al mostrar el mapa. Lo hago (con otro codigo, pero lo hago) El problema que tengo es que la unica forma que he encontrado de inicializar el mapfragment es poniedolo en el designer. Desde ahi se carga y la aplicacion hace lo que tiene que hacer. Pero cuando quiero hacerlo sin el designer me da el error. Tanto si agrego el mapfragment directamente a la activity o a un panel.
** Service (starter) Create **
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object anywheresoftware.b4a.objects.collections.Map.Get(java.lang.Object)' on a null object reference
at anywheresoftware.b4a.objects.MapFragmentWrapper$1.onMapReady(MapFragmentWrapper.java:196)
at com.google.android.gms.maps.MapFragment$zza$1.zza(Unknown Source)
at com.google.android.gms.maps.internal.zzt$zza.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:387)
at wl.a(:com.google.android.gms.DynamiteModulesB:82)
at maps.ad.t$5.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7231)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object anywheresoftware.b4a.objects.collections.Map.Get(java.lang.Object)' on a null object reference
at anywheresoftware.b4a.objects.MapFragmentWrapper$1.onMapReady(MapFragmentWrapper.java:181)
... 12 more
Sub Globals
Private mapa As GoogleMap
Private MapFragment1 As MapFragment
Private MapPanel As Panel
Private camara1 As CameraPosition
End Sub
Sub Activity_Create(FirstTime As Boolean)
'Do not forget to load the layout file created with the visual designer. For example:
Activity.LoadLayout("1")
MapPanel.Initialize("")
Activity.AddView(MapPanel,0%x, 63%y,100%x,37%y)
If MapFragment1.IsGooglePlayServicesAvailable = False Then
ToastMessageShow("Please install Google Play Services.", True)
Else
MapFragment1.Initialize("MapFragment1",MapPanel)
End If
End Sub
Con este codigo funciona, ya que supongo que sera el Designer quien inicializara el mapfragment, que es lo unico que se carga en layout "1", ni siquiera en la posicion que uso, lo he puesto a un lado de la pantalla. En realidad se activan los dos, el que pongo en el Designer fuera de la pantalla y el que coloco en la ubicacion que le indico al panel.
Pero si comento...
B4X:
'Activity.LoadLayout("1")
...para evitar que me cargue el mapfragment del Designer y se inicialice solo con el codigo, de la manera que me indicaba @rscheel o en el agun otro hilo del tema que vi de @Descartex ya me da los errores que indicaba en el post anterior.
En el foro oficial de la ultima librería de google maps le hacen esta misma pregunta a erel, la cual le responde que solo se puede iniciar el mapfragment desde el diseñador en la nueva librería y si quiere seguir usando a través de código tiene que usar la antigua librería.