Spanish [SOLUCIONADO]Inicializar MapFragment de google maps

cas6678

Active Member
Licensed User
Longtime User
Hola a todos,

He seguido el tutorial de @rscheel sobre como usar google maps, todo perfecto, he conseguido incorporarlo a mi aplicacion.

Mi problema es que no uso el desinger para diseñar y me gustaria poder inicializar la vista de mapa y no se como hacerlo.

Especificamente no se que poner en la segunda parte de la instruccion.

Mapfragment1.Initialize("Mapgragment1",parent as android.view.view.group)

Que debo poner en la ultima parte de esta instruccion???
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola a todos,

He seguido el tutorial de @rscheel sobre como usar google maps, todo perfecto, he conseguido incorporarlo a mi aplicacion.

Mi problema es que no uso el desinger para diseñar y me gustaria poder inicializar la vista de mapa y no se como hacerlo.

Especificamente no se que poner en la segunda parte de la instruccion.

Mapfragment1.Initialize("Mapgragment1",parent as android.view.view.group)

Que debo poner en la ultima parte de esta instruccion???

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
 

cas6678

Active Member
Licensed User
Longtime User
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.

Gracias @rscheel
 

rscheel

Well-Known Member
Licensed User
Longtime User
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.

Gracias @rscheel

Que error te envía en el log?
 

rscheel

Well-Known Member
Licensed User
Longtime User
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.

Gracias @rscheel

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
 

cas6678

Active Member
Licensed User
Longtime User
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.

Cuando comento...


B4X:
     'Activity.LoadLayout("1")

y agrego...

B4X:
MapPanel.Initialize("MapPanel")
    Activity.AddView(MapPanel,0%x, 63%y,100%x,37%y)   
    MapFragment1.Initialize("MapFragment1",MapPanel)

me dan los siguientes errores en el log:

B4X:
** 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
 

cas6678

Active Member
Licensed User
Longtime User
Amplio...

B4X:
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.

Que me esta faltando ???
 

rscheel

Well-Known Member
Licensed User
Longtime User
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.

https://www.b4x.com/android/forum/threads/google-maps.63930/page-3

Me imagino que junto con esto tendrías que usar una versión mas antigua de b4a osea una versión inferior a la 5.8 y la antigua sdk de android.
 

cas6678

Active Member
Licensed User
Longtime User
ok, no lo habia leido y mira que di vueltas por todos lados.

Bueno, por un lado me alegra la respuesta ya que yo no podia PORQUE NO SE PODIA....esta vez no fue mi culpa!!! :rolleyes:

Gracias @rscheel
 
Top