2014-10-03 22 views
22

voglio avere MapView dentro la mia FragmentMapView android nei Frammento

Questo è il mio file FragmentLayout XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#17df0d" 
    android:orientation="vertical" > 

<com.google.android.gms.maps.MapView 
    android:id="@+id/mapview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/textView1" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_marginBottom="70dp" > 

</com.google.android.gms.maps.MapView> 
</RelativeLayout> 

Il mio file AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="a.b.c.d" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="your_api_key" /> 
     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 


    </application> 

    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    <permission 
     android:name="a.b.c.d.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="a.b.c.d.permission.MAPS_RECEIVE" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

</manifest> 

e la mia Frammento classe

public class ReportFragment extends Fragment implements LocationListener { 
    MapView mapView = null; //eventually it is being read from view and assigned 

quando lancio l'applicazione, non vedo alcuna guarda la mappa nel mio Frammento

+1

Dov'è il tuo 'MapView' nel layout? –

+0

lo hai visto perché non hai aggiunto 'mapview' ovunque. – Rustam

+2

Penso che tu stia usando 'GoogleMap v2', quindi meglio usare' MapFragment' o 'SupportMapFragment' invece di' MapView'. – Piyush

risposta

37

Da Josh Holtz's example on GitHub:

si dovrebbe aggiungere MapView nel vostro Layout come

<com.google.android.gms.maps.MapView 
    android:id="@+id/mapview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

e implementare il Fragment come

public class SomeFragment extends Fragment { 

MapView mapView; 
GoogleMap map; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)   { 
    View v = inflater.inflate(R.layout.some_layout, container, false); 

    // Gets the MapView from the XML layout and creates it 
    mapView = (MapView) v.findViewById(R.id.mapview); 
    mapView.onCreate(savedInstanceState); 

    // Gets to GoogleMap from the MapView and does initialization stuff 
    map = mapView.getMap(); 
    map.getUiSettings().setMyLocationButtonEnabled(false); 
    map.setMyLocationEnabled(true); 

    // Needs to call MapsInitializer before doing any CameraUpdateFactory calls 
    try { 
     MapsInitializer.initialize(this.getActivity()); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     e.printStackTrace(); 
    } 

    // Updates the location and zoom of the MapView 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(43.1, -87.9), 10); 
    map.animateCamera(cameraUpdate); 

    return v; 
} 

@Override 
public void onResume() { 
    mapView.onResume(); 
    super.onResume(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mapView.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mapView.onLowMemory(); 
    } 

} 
+3

Ho alcune perdite di memoria utilizzando MapView, qualsiasi esperienza simile ? – Caipivara

+0

Sì, ce l'ho anch'io. hai trovato qualche soluzione? –

+0

Lo stesso qui, ma nessuna soluzione di perdite di memoria – andrei

15

Aggiunta alla risposta di MD er:

Da documentation:

Un GoogleMap deve essere acquisita tramite getMapAsync (OnMapReadyCallback). MapView inizializza automaticamente il sistema di mappe e la vista.

Secondo questo, il modo più corretto per inizializzare GoogleMap utilizza getMapAsync.

Nota che la classe deve implementare OnMapReadyCallback

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_map_page, container, false); 

    mMapView = (MapView) v.findViewById(R.id.map_view); 
    mMapView.onCreate(savedInstanceState); 
    mMapView.getMapAsync(this); //this is important 

    return v; 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mGoogleMap = googleMap; 
    mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
    mGoogleMap.addMarker(new MarkerOptions().position(/*some location*/)); 
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(/*some location*/, 10)); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    mMapView.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mMapView.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mMapView.onDestroy(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    mMapView.onSaveInstanceState(outState); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mMapView.onLowMemory(); 
} 
1

Nel caso in cui qualcuno è alla ricerca di una versione Kotlin di MapView Frammento;)

class MapViewKotlinFragment : Fragment(), OnMapReadyCallback { 

private var mMap: MapView? = null 

override fun onSaveInstanceState(outState: Bundle?) { 
    super.onSaveInstanceState(outState) 

    mMap?.onSaveInstanceState(outState) 
} 

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
    val view = inflater?.inflate(R.layout.fragment_map, container, false) 

    mMap = view?.findViewById(R.id.mapViewPlaces) as MapView 
    mMap?.onCreate(savedInstanceState) 
    mMap?.getMapAsync(this) 

    return view 
} 

override fun onResume() { 
    super.onResume() 
    mMap?.onResume() 
} 

override fun onPause() { 
    super.onPause() 
    mMap?.onPause() 
} 

override fun onStart() { 
    super.onStart() 
    mMap?.onStart() 
} 

override fun onStop() { 
    super.onStop() 
    mMap?.onStop() 
} 

override fun onDestroy() { 
    super.onDestroy() 
    mMap?.onDestroy() 
} 

override fun onLowMemory() { 
    super.onLowMemory() 
    mMap?.onLowMemory() 
} 

override fun onMapReady(googleMap: GoogleMap) { 
    googleMap.addMarker(MarkerOptions().position(LatLng(0.0, 0.0)).title("Marker")) 
} 
+0

Grazie, ha funzionato per me, tranne che ho dovuto dichiarare 'mMap' come' MapView? 'Non' GoogleMap? ' –

+0

@ nicolasleo, si scusa. Ho modificato la mia risposta :) – lomza