tag studio log example and android fragment google-maps-android-api-2 mapfragment

log - tag android studio



MapaFragmento en Fragmento, alternativas? (5)

En tu clase

SupportMapFragment mSupportMapFragment; private GoogleMap googleMap; int ZOOM_LEVEL=15; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View mTrackView = inflater .inflate(R.layout.mylayout, container, false); mSupportMapFragment = SupportMapFragment.newInstance(); FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.mapwhere, mSupportMapFragment); fragmentTransaction.commit(); return mTrackView; } @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); if(mSupportMapFragment!=null){ googleMap = mSupportMapFragment.getMap(); if(googleMap!=null){ googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.getUiSettings().setMyLocationButtonEnabled(false); googleMap.setMyLocationEnabled(false); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom( new LatLng(12.12122, 17.22323), ZOOM_LEVEL); googleMap.animateCamera(cameraUpdate); } } }

mylayout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <FrameLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.03" android:id="@+id/mapwhere" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>

Necesito tu ayuda ... trabajo en ello hasta 3 días. Mi aplicación está trabajando con fragmentos. Uno de estos fragmentos debe mostrar un mapa de la API de Google Maps V2 para Android.

Actualmente, estoy usando un MapFragment, pero no es de extrañar, un fragmento en un fragmento no es una buena idea, pero funciona, el mapa se muestra, puedo editarlo pero cuando cambio el fragmento principal y lo vuelvo.

Causado por: java.lang.IllegalArgumentException: línea de archivo XML binario # 59: Id. Duplicada 0x7f070041, etiqueta nula o id. De padre 0x7f070040 con otro fragmento para com.google.android.gms.maps.MapFragment

en android.app.Activity.onCreateView (Activity.java:4252)

en android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:673)

Esta es la causa cuando voy a otro fragmento y regreso al que contiene el mapa. Estoy buscando hasta 3 días para solucionar este problema, pero no hay grandes resultados.

Para continuar, tengo una actividad que llama a un fragmento que contiene un MapFragment en el archivo de diseño. Si necesitas más, solo pregunta :)

Gracias

Edición: Aquí está el código para cambiar Fragmento en la Actividad principal

private void swtichFragment(Fragment fragment, Bundle bundle) { fragment.setBundle(this, bundle); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.rightFragmentPlaceHolder, fragment); fragmentTransaction.commit(); mRightFragment = fragment; }


Después de muchos errores finalmente lo cometí, aquí está mi clase de fragmentos de MapView:

import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.serveroverload.yago.R; /** * @author 663918 * */ public class HomeFragment extends Fragment implements LocationListener { // Class to do operations on the Map GoogleMap googleMap; private LocationManager locationManager; public static Fragment newInstance() { return new HomeFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.home_fragment, container, false); Bundle bdl = getArguments(); // setuping locatiomanager to perfrom location related operations locationManager = (LocationManager) getActivity().getSystemService( Context.LOCATION_SERVICE); // Requesting locationmanager for location updates locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 1, 1, this); // To get map from MapFragment from layout googleMap = ((MapFragment) getActivity().getFragmentManager() .findFragmentById(R.id.map)).getMap(); // To change the map type to Satellite // googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); // To show our current location in the map with dot // googleMap.setMyLocationEnabled(true); // To listen action whenever we click on the map googleMap.setOnMapClickListener(new OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { /* * LatLng:Class will give us selected position lattigude and * longitude values */ Toast.makeText(getActivity(), latLng.toString(), Toast.LENGTH_LONG).show(); } }); changeMapMode(3); // googleMap.setSatellite(true); googleMap.setTrafficEnabled(true); googleMap.setBuildingsEnabled(true); googleMap.setMyLocationEnabled(true); return v; } private void doZoom() { if (googleMap != null) { googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom( new LatLng(18.520430, 73.856744), 17)); } } private void changeMapMode(int mapMode) { if (googleMap != null) { switch (mapMode) { case 0: googleMap.setMapType(GoogleMap.MAP_TYPE_NONE); break; case 1: googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); break; case 2: googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); break; case 3: googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); break; case 4: googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); break; default: break; } } } private void createMarker(double latitude, double longitude) { // double latitude = 17.385044; // double longitude = 78.486671; // lets place some 10 random markers for (int i = 0; i < 10; i++) { // random latitude and logitude double[] randomLocation = createRandLocation(latitude, longitude); // Adding a marker MarkerOptions marker = new MarkerOptions().position( new LatLng(randomLocation[0], randomLocation[1])).title( "Hello Maps " + i); Log.e("Random", "> " + randomLocation[0] + ", " + randomLocation[1]); // changing marker color if (i == 0) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); if (i == 1) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_BLUE)); if (i == 2) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_CYAN)); if (i == 3) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); if (i == 4) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); if (i == 5) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)); if (i == 6) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_RED)); if (i == 7) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); if (i == 8) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_VIOLET)); if (i == 9) marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)); googleMap.addMarker(marker); // Move the camera to last position with a zoom level if (i == 9) { CameraPosition cameraPosition = new CameraPosition.Builder() .target(new LatLng(randomLocation[0], randomLocation[1])) .zoom(15).build(); googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); } } } /* * creating random postion around a location for testing purpose only */ private double[] createRandLocation(double latitude, double longitude) { return new double[] { latitude + ((Math.random() - 0.5) / 500), longitude + ((Math.random() - 0.5) / 500), 150 + ((Math.random() - 0.5) * 10) }; } @Override public void onLocationChanged(Location location) { if (null != googleMap) { // To get lattitude value from location object double latti = location.getLatitude(); // To get longitude value from location object double longi = location.getLongitude(); // To hold lattitude and longitude values LatLng position = new LatLng(latti, longi); createMarker(latti, longi); // Creating object to pass our current location to the map MarkerOptions markerOptions = new MarkerOptions(); // To store current location in the markeroptions object markerOptions.position(position); // Zooming to our current location with zoom level 17.0f googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(position, 17f)); // adding markeroptions class object to the map to show our current // location in the map with help of default marker googleMap.addMarker(markerOptions); } } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onDestroyView() { // TODO Auto-generated method stub super.onDestroyView(); locationManager.removeUpdates(this); android.app.Fragment fragment = getActivity().getFragmentManager() .findFragmentById(R.id.map); if (null != fragment) { android.app.FragmentTransaction ft = getActivity() .getFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); } } }

Mi archivo Xml se ve así:

<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent" />

Y el resultado se ve así: -

Lo más importante a tener en cuenta es que la aplicación DO Not Mix.Fragment with v4.Fragments else se bloqueará gravemente.

Como puede ver, he usado app.Fragment para adjuntar y eliminar mi Fragmento MapView

Espero que ayude a alguien


Use MapView en lugar de MapFragment en el diseño de su Fragmento. Recuerda llamar a los métodos del ciclo de vida de MapView:

  • onCreate (Bundle)
  • En resumen()
  • en pausa ()
  • onDestroy ()
  • onSaveInstanceState (paquete)
  • onLowMemory ()

como se describe here .

Por cierto no debe usar MapFragment, solo SupportMapFragment y la biblioteca de soporte .

Editar:

Si cambia a biblioteca de soporte, puede usar el código del comentario # 1 aquí: http://code.google.com/p/gmaps-api-issues/issues/detail?id=5064#c1


Use SupportMapFragment para superar este error:

En el diseño de fragmentos

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

En tu fragmento onCreateView

SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.googleMap); if (mapFragment != null) { mapFragment.getMapAsync(this); }

Dado que su diseño está en el diseño Fragment''s , por lo tanto, SupportMapFragment es el diseño secundario de su fragmento. Por lo tanto, use getChildFragmentManager() que es Fragment''s FragmentManager


Como se describe aquí

Para mostrar MapFragment dentro del fragmento (NestedFragment): En este punto creo que tienes

  1. añadido permiso necesario en el manifiesto
  2. servicio de Google Play agregado como un proyecto lib
  3. Api clave en el archivo de manifiesto. 4.

donde.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <FrameLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.03" android:name="com.google.android.gms.maps.SupportMapFragment" android:id="@+id/mapwhere" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>

clase:

public class WhereFragment extends SupportMapFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.where, null, false); initilizeMap(); return root; } private void initilizeMap() { mSupportMapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapwhere); if (mSupportMapFragment == null) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); mSupportMapFragment = SupportMapFragment.newInstance(); fragmentTransaction.replace(R.id.mapwhere, mSupportMapFragment).commit(); } if (mSupportMapFragment != null) { googleMap = mSupportMapFragment.getMap(); if (googleMap != null) googleMap.setOnMapClickListener(new OnMapClickListener() { @Override public void onMapClick(LatLng point) { //TODO: your onclick stuffs } }); } } }

Documentacion

Fragmentos anidados Ahora puede incrustar fragmentos dentro de fragmentos. Esto es útil para una variedad de situaciones en las que desea colocar componentes UI dinámicos y reutilizables en un componente UI que sea dinámico y reutilizable. Por ejemplo, si usa ViewPager para crear fragmentos que se deslizan hacia la izquierda y hacia la derecha y consumen la mayor parte del espacio de la pantalla, ahora puede insertar fragmentos en cada página de fragmentos.

Para anidar un fragmento, simplemente llame a getChildFragmentManager () en el fragmento en el que desea agregar un fragmento. Esto devuelve un FragmentManager que puede usar como lo hace normalmente en la actividad de nivel superior para crear transacciones fragmentarias. Por ejemplo, aquí hay algo de código que agrega un fragmento dentro de una clase Fragment existente:

Fragmento videoFragment = nuevo VideoPlayerFragment (); FragmentTransaction transaction = getChildFragmentManager (). BeginTransaction (); transaction.add (R.id.video_fragment, videoFragment) .commit (); Desde dentro de un fragmento anidado, puede obtener una referencia al fragmento primario llamando a getParentFragment ().

La biblioteca de soporte de Android ahora también admite fragmentos anidados, por lo que puede implementar diseños de fragmentos anidados en Android 1.6 y superior.

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.

fuente: http://developer.android.com/about/versions/android-4.2.html#NestedFragments

Esto también solucionará para:

11-06 11:36:01.509: E/AndroidRuntime(6309): FATAL EXCEPTION: main 11-06 11:36:01.509: E/AndroidRuntime(6309): android.view.InflateException: Binary XML file line #9: Error inflating class fragment 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.rInflate(LayoutInflater.java:760) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.rInflate(LayoutInflater.java:760) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.rInflate(LayoutInflater.java:760) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.rInflate(LayoutInflater.java:760) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-06 11:36:01.509: E/AndroidRuntime(6309): at com.abc.android.ui.WhereFragment.onCreateView(WhereFragment.java:60) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 11-06 11:36:01.509: E/AndroidRuntime(6309): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 11-06 11:36:01.509: E/AndroidRuntime(6309): at a ...