varios studio marcadores google example ejemplo custom agregar android google-maps-android-api-2

android - studio - ¿Cómo usar google map V2 dentro del fragmento?



google maps api (9)

Tengo un fragmento que forma parte de Viewpager y quiero usar Google Map V2 dentro de ese fragmento. Esto es lo que he intentado hasta ahora,

En mi fragmento,

private SupportMapFragment map; private GoogleMap mMapView; @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); FragmentManager fm = getChildFragmentManager(); map = (SupportMapFragment) fm.findFragmentById(R.id.map); if (map == null) { map = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map, map).commit(); } } @Override public void onResume() { super.onResume(); if (mMapView == null) { mMapView = map.getMap(); Marker hamburg = mMapView.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = mMapView.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); // Zoom in, animating the camera. mMapView.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); } }

y en mi diseño subfragment_info.xml, tengo,

<fragment android:id="@+id/map" class="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="300dp" android:layout_alignParentLeft="true" android:layout_below="@+id/tableLayout1" />

Puedo ver el mapa ahora. Pero los marcadores no se muestran. Creo que mi mapa de Google mMapView es nulo. Por favor ayúdame a resolver este problema. Gracias por adelantado.


Así es como lo hice.

en el diseño:

<fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight=".90" class="com.google.android.gms.maps.SupportMapFragment" />

en codigo:

public class GPS extends FragmentActivity { @Override protected void onResume() { super.onResume(); setUpMapIfNeeded(); } private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (supportMap == null) { // Try to obtain the map from the SupportMapFragment. supportMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMap(); // Check if we were successful in obtaining the map. if (supportMap != null) { MarkerOptions mo = new MarkerOptions().position( new LatLng( latitude, longitude ) ); supportMap.addMarker( mo ); } } } }

Me tomaste muchas dudas, necesitas la combinación correcta de cosas, asegúrate de que tu clase extienda FragmentActivity


Cree un marco para el mapa en el que se agregará en su diseño xml

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/map_container"> <!-- The map fragments will go here --> </RelativeLayout>

No incluya class = "com.google.android.gms.maps.SupportMapFragment" en xml, ya sea en su clase de fragmentos, hágalo manualmente en onActivityCreated

@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentManager fm = getChildFragmentManager(); fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container); if (fragment == null) { fragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map_container, fragment).commit(); } /***at this time google play services are not initialize so get map and add what ever you want to it in onResume() or onStart() **/ } @Override public void onResume() { super.onResume(); if (map == null) { map = fragment.getMap(); map.addMarker(new MarkerOptions().position(new LatLng(0, 0))); } }

si ustedes enfrentan algún problema, se produce una excepción de estado ilegal, simplemente escriba el código debajo

/ * * Este problema se rastrea en (Google Bugs) * http://code.google.com/p/gmaps-api-issues/issues/detail?id=5064 agregó * Código debido a una excepción de estado ilegal Ocurre cuando se vuelve a hacer clic en pestaña * * Una solución temporal a corto plazo que lo solucionó para mí es agregar lo siguiente a * onDetach () de cada Fragmento al que llamas * /

@Override public void onDetach() { super.onDetach(); try { Field childFragmentManager = Fragment.class .getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } }

// Si desea mostrar el mapa en actividad, simplemente extienda su actividad mediante // FragmentActivity escriba el código a continuación.

En onCreate

FragmentManager fm = getSupportFragmentManager(); fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container); if (fragment == null) { fragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map_container, fragment) .commit(); }

En onResume

@Override protected void onResume() { super.onResume(); if (googleMap == null) { initilizeMap(); } } private void initilizeMap() { if (googleMap != null) { googleMap = fragment.getMap(); googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.getUiSettings().setMyLocationButtonEnabled(true); googleMap.getUiSettings().setCompassEnabled(true); googleMap.getUiSettings().setRotateGesturesEnabled(true); CameraPosition cameraPosition = new CameraPosition.Builder() .target(new LatLng(latitude, longitude)).zoom(10).build(); googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); // create marker MarkerOptions marker = new MarkerOptions().position(new LatLng( latitude, longitude)); // ROSE color icon marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); // adding marker googleMap.addMarker(marker); // check if map is created successfully or not if (googleMap == null) { Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT) .show(); } } }

Ayuda adicional puede obtener de estos enlaces
https://code.google.com/p/gmaps-api-issues/issues/detail?id=5064#c1 https://developers.google.com/maps/documentation/android/map


Debe decidir si crea su fragmento en el código new SupportMapFragment() o infla desde xml class="com.google.android.gms.maps.SupportMapFragment" .

Realmente no puedes tener un Fragment en xml para otro Fragment . Lea acerca de Fragment anidados s .

Puede seguir este comentario sobre cómo agregar SupportMapFragment anidado.


En el enlace, responde por ti:

"El problema es que lo que estás tratando de hacer no debería hacerse. No debes inflar fragmentos dentro de otros fragmentos. De la documentación de Android:

Nota: No puede inflar un diseño en un fragmento cuando ese diseño incluye a. Los fragmentos anidados solo son compatibles cuando se agregan dinámicamente a un fragmento.

Si bien puede realizar la tarea con los trucos aquí presentados, le sugiero que no lo haga. Es imposible estar seguro de que estos hacks manejarán lo que hace cada nuevo sistema operativo Android cuando intentas inflar un diseño para un fragmento que contiene otro fragmento.

La única forma compatible con Android de agregar un fragmento a otro fragmento es a través de una transacción del administrador de fragmentos secundarios ".

Para este problema:

Id. Duplicado, etiqueta nula o id. Principal con otro fragmento para com.google.android.gms.maps.MapFragment

Para mí, la mejor solución son las de @DeepakPanwar.


Para cargar mapa en fragmento:

<fragment android:id="@+id/fragmentMap1" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/>

Para .java:

public class PathFragment extends Fragment { View view; GoogleMap mMap; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view=inflater.inflate(R.layout.fragment_path,null); setupMap(); return view; } private void setupMap() { if (mMap == null) { mMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map1)).getMap(); mMap.getUiSettings().setZoomControlsEnabled(true); } mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { getlocation(); } }); } public void getlocation() { try { /*Collect Source and destination latitude and longitude * To draw Polyline * */ LatLng src = new LatLng(Double.parseDouble(AppGlobal.WorkerHistory.getOrder_lat()),Double.parseDouble(AppGlobal.WorkerHistory.getOrder_lng())); LatLng dest =new LatLng(Double.parseDouble(AppGlobal.WorkerHistory.getWorker_lat()),Double.parseDouble(AppGlobal.WorkerHistory.getWorker_lng())); //Add Marker mMap.addMarker(new MarkerOptions() .position(src) .title("Source") .icon(BitmapDescriptorFactory.fromResource(R.drawable.srcicon))); mMap.addMarker(new MarkerOptions() .position(dest) .title("Destination") .icon(BitmapDescriptorFactory.fromResource(R.drawable.desticon))); Polyline line = mMap.addPolyline( new PolylineOptions().add( new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude) ).width(5).color(Color.RED).geodesic(true) ); //set zoom level LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(src); builder.include(dest); LatLngBounds bounds = builder.build(); int padding = 0; // offset from edges of the map in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); mMap.animateCamera(cu); } catch (Exception e) { e.printStackTrace(); } } }


Si sustituyo el fragmento, donde se encuentra el fragmento del mapa (en este ejemplo de código MyFragment) con un fragmento diferente y luego vuelvo, obtengo una excepción IllegalStateException

public class Home_Map extends Fragment { GoogleMap googleMap; FragmentManager myFragmentManager; SupportMapFragment mySupportMapFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View rootView = inflater.inflate(R.layout.fragment_home__map, container, false); //googleMap.setMyLocationEnabled(true); try { // Loading map initilizeMap(); googleMap.setMyLocationEnabled(true); } catch (Exception e) { e.printStackTrace(); } return rootView; } private void initilizeMap() { try { if (googleMap == null) { myFragmentManager = getFragmentManager(); mySupportMapFragment = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map2); googleMap = mySupportMapFragment.getMap(); if (googleMap == null) { Toast.makeText(getActivity().getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT) .show(); } } } catch (Exception e) { Toast.makeText(getActivity().getApplicationContext(), ""+e, 1).show(); // TODO: handle exception } } @Override public void onResume() { super.onResume(); initilizeMap(); } @Override public void onDetach() { // TODO Auto-generated method stub super.onDetach(); try { Field childFragmentManager = Fragment.class .getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } }


Tuve más o menos el mismo problema. Tenía un cajón de navegación y quería poner el mapa en un fragmento.

Seguí este hilo (pero está en español): https://groups.google.com/forum/#!msg/desarrolladores-android/1cvqPm0EZZU/Q801Yvb2ntYJ

La pista era (en mi opinión) cambiar el archivo layout.xml: en lugar de un "fragmento" dentro de su "subfragment_info.xml diseño", tendría que cambiar a esto:

<com.google.android.gms.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" />`

Aquí está el código dentro del hilo (puede usarlo y adaptarlo): https://groups.google.com/d/msg/desarrolladores-android/1cvqPm0EZZU/9srw_9feamUJ


mi enfoque es:

Bundle bundle = new Bundle(); bundle.putInt(MY_ID, id); FragmentManager fm = getFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.customer_details_fragment); fragment = new SalesFragment(); fm.beginTransaction() .add(R.id.customer_details_fragment, fragment) .commit(); fragment.setArguments(bundle);


Para MapFragment

<fragment android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent" />

En tu clase de fragmentos

map = ((MapFragment) getActivity().getFragmentManager() .findFragmentById(R.id.map)).getMap(); map.addMarker(new MarkerOptions().position( new LatLng(13.031902, 80.278823)).title("Marker Title"));

Para SupportMapFragment

<fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" />

En tu clase de fragmentos

map = ((SupportMapFragment) getActivity().getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); map.addMarker(new MarkerOptions().position( new LatLng(13.031902, 80.278823)).title("Marker Title"));

Nota: el mapa SupportMapFragment se procesa una vez que el usuario toca el mapa