Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


MapFragment en Fragment, alternativas?

Necesito tu ayuda … Trabajo en ella hasta 3 días. Mi aplicación está trabajando con fragmentos. Uno de estos fragmentos tiene que mostrar un mapa de la api de Google Maps V2 para Android.

Actualmente, estoy utilizando un MapFragment, pero no es sorpresa, un fragmento en un fragmento no es una buena idea, pero funciona, el mapa se muestra, puedo editarlo, pero cuando cambio de fragmento principal y volver sobre él.

Causado por: java.lang.IllegalArgumentException: Línea de archivo XML binario # 59: Id de duplicado 0x7f070041, etiqueta nula o identificador de origen 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 en otro fragmento y vuelvo a la que contiene el mapa. Estoy buscando hasta 3 días para arreglar esto, pero no grandes resultados.

Para reanudar por usted, 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

Editar: 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; } 

  • MapFragment: mal rendimiento después de usar el botón de retroceso
  • Cambiar fragmentos - Google Map Fragmento V2 - La actividad ha sido destruida Error
  • Mover MapFragment (SurfaceView) hace que el fondo negro parpadee
  • Cómo preservar / volver a enlazar a los oyentes de eventos en MapFragment después de girar el dispositivo (retrato / paisaje)?
  • ClassNotFoundException leyendo un objeto Serializable en una clase que extiende MapFragment en onSaveInstanceState
  • Archivo binario línea # 8: Error al inflar el fragmento de la clase, Google Maps
  • Android Google Maps: deshabilita el arrastrar en MapFragment
  • Mapfragment findFragmentById siempre null
  • 5 Solutions collect form web for “MapFragment en Fragment, alternativas?”

    Utilice MapView en lugar de MapFragment en el diseño de su fragmento. Recuerde llamar a los métodos de ciclo de vida de MapView:

    • OnCreate (Paquete)
    • En resumen()
    • OnPause ()
    • OnDestroy ()
    • OnSaveInstanceState (Paquete)
    • OnLowMemory ()

    Como se describe aquí .

    Por cierto. Usted no debe utilizar MapFragment, sólo SupportMapFragment y la biblioteca de soporte .

    Editar:

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

    Utilice SupportMapFragment para solucionar este error:

    En el diseño del fragmento

     <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 el 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 usted tiene

    1. Agregó el permiso necesario en el manifiesto
    2. Agregó el servicio de Google Play como un proyecto lib
    3. Clave api 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 } }); } } } 

    Documentación :

    Fragmentos anidados Ahora puede incrustar fragmentos dentro de fragmentos. Esto es útil para una variedad de situaciones en las que se desea ubicar componentes de interfaz de usuario dinámicos y reutilizables en un componente de interfaz de usuario que sea dinámico y reutilizable. Por ejemplo, si utiliza ViewPager para crear fragmentos que pasan a la izquierda y la derecha y consumen la mayoría 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 utilizar como lo hace normalmente desde la actividad de nivel superior para crear transacciones de fragmentos. Por ejemplo, aquí hay algún código que agrega un fragmento dentro de una clase de fragmento existente:

    Fragmento videoFragment = new VideoPlayerFragment (); FragmentTransaction transacción = getChildFragmentManager (). BeginTransaction (); Transaction.add (R.id.video_fragment, videoFragment) .commit (); Desde dentro de un fragmento anidado, puede obtener una referencia al fragmento padre llamando a getParentFragment ().

    La Biblioteca de soporte de Android también admite fragmentos anidados, por lo que puede implementar diseños de fragmentos anidados en Android 1.6 y versiones superiores.

    Nota: No se puede inflar un diseño en un fragmento cuando ese diseño incluye a. Los fragmentos anidados sólo se admiten cuando se añaden dinámicamente a un fragmento.

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

    Esto también arreglará 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 ... 

    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> 

    Después de muchos errores finalmente lo hice, aquí está mi clase MapView Fragment: –

     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 parece a esto: –

    Introduzca aquí la descripción de la imagen

    Lo más importante a tener en cuenta es que NO Mezcla app.Fragment con v4.Fragments else app fallará mal.

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

    Espero que ayude a alguien

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.