Android Google Maps en Fragmento

Estoy desarrollando una aplicación con un menú en la parte superior con algunos botones dentro de ese menú. Estoy tratando de agregar google maps a uno de los botones, pero no tengo mucho éxito. Estaba siguiendo este tutorial, pero en lugar de ejecutar los mapas de google directamente en MainActivity a un fragmento que se inicia cuando se pulsa el botón. Todo funcionó bien. Cuando presiono el botón los mapas se cargan y funcionan como deberían. Cuando MainActivity el botón de inicio para volver a MainActivity funciona perfectamente, pero cuando quiero cargar mapas de nuevo me da debugging error: Class File Editor: Source not found

Este es el código del fragmento de GoogleMaps :

 public class GoogleMaps extends Fragment{ private GoogleMap googleMap; double latitude = 46.514249; double longitude = 15.080183; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View myFragmentView = inflater.inflate(R.layout.maps_layout, container, false); try { // Loading map initilizeMap(); } catch (Exception e) { Log.e("ERROR", "ERROR IN CODE: " + e.toString()); e.printStackTrace(); } return myFragmentView; } private void initilizeMap() { if (googleMap == null) { googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude))); CameraPosition cameraPosition = new CameraPosition.Builder().target( new LatLng(latitude, longitude)).zoom(12).build(); googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); // check if map is created successfully or not if (googleMap == null) { Toast.makeText(getActivity(), "Sorry! unable to create maps", Toast.LENGTH_SHORT) .show(); } } } } 

Cualquier ayuda será apreciada.

EDIT: Si no fuera lo suficientemente específico. Funciona cuando carga el fragment una vez (por primera vez) pero no funciona cuando intento cargarlo de nuevo (segunda vez).

EDIT v2: En realidad he encontrado solución yo mismo. Todo lo que tenía que hacer era añadir el método OnDestroyView :

 public void onDestroyView() { super.onDestroyView(); Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); } 

Gracias de cualquier manera.

 public class MapCurrentLoactionFragment extends Fragment { public static MapView mapView; public static GoogleMap map; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_currentlocation_map, container, false); try { // Gets the MapView from the XML layout and creates it mapView = (MapView) v.findViewById(R.id.mapview); mapView.onCreate(savedInstanceState); mapView.onResume(); // Gets to GoogleMap from the MapView and does initialization stuff map = mapView.getMap(); // Changing map type map.setMapType(GoogleMap.MAP_TYPE_NORMAL); // googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); // googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); // googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); // googleMap.setMapType(GoogleMap.MAP_TYPE_NONE); // Showing / hiding your current location map.setMyLocationEnabled(false); // Enable / Disable zooming controls map.getUiSettings().setZoomControlsEnabled(true); // Enable / Disable my location button map.getUiSettings().setMyLocationButtonEnabled(true); // Enable / Disable Compass icon map.getUiSettings().setCompassEnabled(true); // Enable / Disable Rotate gesture map.getUiSettings().setRotateGesturesEnabled(true); // Enable / Disable zooming functionality map.getUiSettings().setZoomGesturesEnabled(true); MapsInitializer.initialize(this.getActivity()); } catch(Exception e) { System.out.println(e); } return v; } XML: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.google.android.gms.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

Echa un vistazo a mi implementación que funciona muy bien y también una dosis de comprobación en el dispositivo antes de tratar de mostrar el mapa como si los servicios Google Play están instalados. Quizás te ayude. Estoy usando una FragmentActivity simple e inflando un diseño que contiene un SupportedMapFragment.

Aquí está el código:

 public class LocationActivity extends FragmentActivity { private GoogleMap map; private long rec_id; private String address; private Marker selectedLoc; private boolean isSessionClosed; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); BugSenseHandler.initAndStartSession(this, Constants.BugSenseKEY); setContentView(R.layout.preview_location); RelativeLayout cancel_btn = (RelativeLayout) findViewById(R.id.cancel_btn); LinearLayout save_location_btn = (LinearLayout) findViewById(R.id.delete_btn); save_location_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (address != null) { ReceiptDataSource r = new ReceiptDataSource(); r.updateReceiptLocation(rec_id, address); Intent returnIntent = new Intent(getBaseContext(), EditReceiptActivity.class); returnIntent.putExtra("result", address); setResult(RESULT_OK, returnIntent); finish(); } else { Utils.showToast(getApplicationContext(), getString(R.string.c_unknownLocation), Toast.LENGTH_SHORT); } } }); cancel_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); if (map == null) { map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); if (isGoogleMapsInstalled()) { if (map != null) { retrieveLocation(); } } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Install Google Maps"); builder.setCancelable(false); builder.setPositiveButton("Install", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps")); startActivity(intent); //Finish the activity so they can't circumvent the check finish(); } }); AlertDialog dialog = builder.create(); dialog.show(); } } } @Override protected void onResume() { super.onResume(); if (isSessionClosed) { BugSenseHandler.startSession(this); isSessionClosed = false; } } @Override protected void onPause() { super.onPause(); BugSenseHandler.closeSession(this); isSessionClosed = true; } @Override public void onBackPressed() { map.clear(); super.onBackPressed(); } private void retrieveLocation() { Intent intent = getIntent(); address = intent.getStringExtra("location"); assert address != null; if (address.equalsIgnoreCase("")) { address = Utils.getCurrentLocation(LocationActivity.this); } rec_id = intent.getLongExtra("receipt_to_update_location", 0); final Geocoder geocoder = new Geocoder(this, Locale.US); double latitude = 0, longitude = 0; try { List<Address> loc = geocoder.getFromLocationName(address, 5); if (loc.size() > 0) { latitude = loc.get(0).getLatitude(); longitude = loc.get(0).getLongitude(); } else { //Toast.makeText(getBaseContext(), getResources().getString(R.string.UnableToFindLocation),Toast.LENGTH_SHORT).show(); Utils.showToast(LocationActivity.this, getString(R.string.UnableToFindLocation), Toast.LENGTH_SHORT); } selectedLoc = map.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title(address).draggable(true)); map.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { } @Override public void onMarkerDrag(Marker marker) { } @Override public void onMarkerDragEnd(Marker marker) { try { List<Address> addresses = geocoder.getFromLocation(selectedLoc.getPosition().latitude, selectedLoc.getPosition().longitude, 1); StringBuilder sb = new StringBuilder(); if (addresses.size() > 0) { Address address = addresses.get(0); if (address.getAddressLine(0) != null) sb.append(address.getAddressLine(0)).append(", "); if (address.getLocality() != null) sb.append(address.getLocality()).append(", "); if (address.getCountryName() != null) sb.append(address.getCountryName()); } address = sb.toString(); } catch (IOException e) { } } }); map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 12)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(12), 2000, null); } catch (IOException e) { Log.e("IOException", e.getMessage()); //Toast.makeText(this, getString(R.string.c_unknownLocation), Toast.LENGTH_LONG).show(); Utils.showToast(LocationActivity.this, getString(R.string.c_unknownLocation), Toast.LENGTH_LONG); } } public boolean isGoogleMapsInstalled() { try { ApplicationInfo info = getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } 

Y el diseño correspondiente:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/ro.gebs.captoom" android:id="@+id/location_stuff" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/greenish" android:orientation="vertical"> <RelativeLayout android:id="@+id/location_header" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@color/greenish"> <RelativeLayout android:id="@+id/cancel_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:background="@drawable/done_rounded_btn" android:gravity="center"> <ro.gebs.captoom.utils.fonts.CustomFontTextView android:id="@+id/retake_txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginTop="10dp" android:gravity="center" android:paddingLeft="7dp" android:paddingRight="7dp" android:text="@string/cancel" android:textAllCaps="true" android:textColor="#FFFFFF" android:textSize="14sp" custom:fontName="Bold"/> </RelativeLayout> <ro.gebs.captoom.utils.fonts.CustomFontTextView android:id="@+id/location_txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:gravity="center_vertical" android:text="@string/location_map" android:textAllCaps="true" android:textColor="@color/done_color" android:textSize="16sp" custom:fontName="SemiBold"/> </RelativeLayout> <fragment android:layout_weight="6" android:id="@+id/map" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_width="match_parent" android:layout_height="0dp" class="com.google.android.gms.maps.SupportMapFragment"/> <RelativeLayout android:id="@+id/save_location_layout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@color/greenish"> <LinearLayout android:id="@+id/delete_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_marginLeft="25dp" android:layout_marginRight="25dp" android:background="@drawable/done_btn_selector" android:orientation="horizontal" android:paddingBottom="7dip" android:paddingTop="7dip" android:weightSum="7"> <ro.gebs.captoom.utils.fonts.CustomFontTextView android:id="@+id/delete_txt" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="6" android:background="@null" android:paddingLeft="10dp" android:text="@string/save_location" android:textAllCaps="true" android:textColor="@color/white" android:textSize="16sp" custom:fontName="Bold"/> <ImageView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:paddingLeft="10dp" android:paddingRight="10dp" android:src="@drawable/input_map_white"/> </LinearLayout> </RelativeLayout> </LinearLayout> 
  • ¿Cómo puedo determinar las coordenadas de longitud y latitud para crear un radio de 1 milla alrededor de la ubicación de un usuario?
  • Cómo colocar marcador de ubicación en Google Maps en Offline?
  • Heap sigue aumentando en Google Map API V2
  • Android maps v2 se bloquea cuando se vuelve a abrir en fragmento
  • Mapas de Open Street con Android Google Maps Api v2
  • Cómo dibujar un triángulo lleno en lienzo android?
  • MapFragment en ScrollView
  • Android cómo usar location.distanceTo ()
  • Cómo tamaño de los iconos de marcadores personalizados para Android Google Maps v2?
  • Cómo mostrar el icono parpadeando en el mapa de google
  • Agregando marcador múltiple en google map en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.