MapFragment in Frammento, alternative?

Ho bisogno del tuo aiuto … sto lavorando fino a 3 giorni. La mia applicazione sta lavorando con frammenti. Uno di questi frammenti deve visualizzare una mappa dall'Api di Google Maps V2 per Android.

Attualmente sto utilizzando un MapFragment, ma non c'è sorpresa, un frammento di un frammento non è una buona idea, ma funziona, la mappa è visualizzata, posso modificarla, ma quando commuto il frammento principale e return su di esso.

  • Utilizzando SimpleCursorAdapter.ViewBinder per modificare il colore di TextView
  • Disegnare cerchio di certo raggio sulla visualizzazione mappa in android
  • Che cosa è "strumenti: context" nei file di layout di Android?
  • Come controllare la visibilità di TextView utilizzando IF
  • android impedisce a EditText di richiedere la messa a fuoco automatica
  • Android Volley Post Request - Soluzione alternativa per JsonArrayRequest
  • Causa: java.lang.IllegalArgumentException: Linea file binaria binaria # 59: duplicare id 0x7f070041, tag null o parent id 0x7f070040 con un altro frammento per com.google.android.gms.maps.Fragment di cartella

    a android.app.Activity.onCreateView (Attività.java:4252)

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

    Questa è la causa quando vado ad un altro frammento e ritornerò a quello che contiene la mappa. Sto cercando fino a 3 giorni per risolvere questo ma non ottimi risultati.

    Per riprendere per te, ho un'attività che chiama un frammento che contiene un MapFragment nel file di layout. Se hai bisogno di più, basta chiedere 🙂

    Grazie

    Modifica: Ecco il codice per modificare il frammento nell'attività principale

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

  • Spostare la visualizzazione di text attraverso lo schermo integer
  • LibGDX: Android SpriteBatch non disegno
  • Come aggiornare Widget App con visualizzazione di elenco da un'attività
  • Come impostare la barra di avanzamento per l'attività di caricamento con i dati in android
  • Creazione di LinearLayout in Java - Elementi non vengono visualizzati
  • Come apporre la mia app Android nell'elenco di condivisione di un'altra applicazione specifica
  • 5 Solutions collect form web for “MapFragment in Frammento, alternative?”

    Utilizza MapView invece di MapFragment nel layout del frammento. Ricorda di call i methods del ciclo di vita di MapView:

    • onCreate (Bundle)
    • onResume ()
    • onPause ()
    • OnDestroy ()
    • onSaveInstanceState (Bundle)
    • onLowMemory ()

    come descritto qui .

    Btw. non si dovrebbe utilizzare MapFragment, solo SupportMapFragment e libreria di supporto .

    Edit:

    Se si passa alla libreria di supporto, è ansible utilizzare il codice del commento # 1 qui: http://code.google.com/p/gmaps-api-issues/issues/detail?id=5064#c1

    Utilizza SupportMapFragment per superare questo errore:

    Nel layout del frammento

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

    Nel tuo frammento onCreateView

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

    Poiché il tuo layout è nel layout del Fragment's , quindi il SupportMapFragment è il layout figlio del tuo frammento. Quindi utilizzare getChildFragmentManager() che è Fragment's FragmentManager

    Come descritto qui

    Per visualizzare MapFragment all'interno del frammento (NestedFragment): A questo punto credo di avere

    1. ha aggiunto il permesso necessario sul manifesto
    2. ha aggiunto il servizio google play come progetto lib
    3. chiave api nel file manifesto. 4.

    where.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> 

    class:

      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 } }); } } } 

    Documentazione :

    Frammenti nidificati Ora è ansible incorporare frammenti all'interno di frammenti. Questo è utile per una varietà di situazioni in cui si desidera inserire componenti UI dinamici e riutilizzabili in un componente UI che è in sé dinamico e riutilizzabile. Ad esempio, se utilizzi ViewPager per creare frammenti che scorrono a sinistra ea destra e consumano la maggior parte dello spazio dello schermo, adesso puoi inserire frammenti in each pagina di frammento.

    Per nidificare un frammento, call getChildFragmentManager () sul frammento in cui si desidera aggiungere un frammento. Questo restituisce un FragmentManager che è ansible utilizzare come normalmente fare dall'attività di livello superiore per creare transactions di frammentazione. Ad esempio, ecco un codice che aggiunge un frammento all'interno di una class Fragment esistente:

    Fragment videoFragment = nuovo VideoPlayerFragment (); Transazione FragmentTransaction = getChildFragmentManager (). BeginTransaction (); transaction.add (R.id.video_fragment, videofragmento) .commit (); Da un frammento annidato, è ansible get un riferimento al frammento padre chiamando getParentFragment ().

    La libreria di supporto Android support anche frammenti nidificati, in modo da poter implementare disegni di frammenti nidificati su Android 1.6 e versioni successive.

    Nota: non è ansible gonfiare un layout in un frammento quando il layout include a. I frammenti nidificati vengono supportti solo quando vengono aggiunti dynamicmente a un frammento.

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

    Questo risolverà anche per:

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

    Nella tua class

      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> 

    Dopo un sacco di errori ho finalmente fatto, ecco la mia class di frammento di 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(); } } } 

    Il mio file Xml sembra questo: –

     <?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" /> 

    E il risultato sembra questo: –

    immettere qui la descrizione dell'immagine

    La cosa più importnte da notare è che DO non mescolare app.Fragment con v4.Fragments altro app si blocca male.

    Come potete vedere, ho usato app.Fragment per albind e rimuovere il mio frammento MapView

    Spero che aiuterà qualcuno

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.