Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android MapView in Fragment

I want to have MapView inside my Fragment

This is my FragmentLayout xml file

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

My AndroidManifest.xml file

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

and my Fragment class

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

when I launch the app, I do not see any map view in my Fragment

like image 541
user3833308 Avatar asked Oct 03 '14 06:10

user3833308


People also ask

What is MapFragment?

public class MapFragment extends Fragment. A Map component in an app. This fragment is the simplest way to place a map in an application. It's a wrapper around a view of a map to automatically handle the necessary life cycle needs.

How do you ensure that the Google Maps Android API v2 is enabled?

Click on the “APIs & auth” menu on the left, and from the submenu select APIs. From the list of APIs that appear, scroll down and ensure that Google Maps Android API v2 is set to “On”.


2 Answers

From Josh Holtz's example on GitHub:

You should add MapView in your Layout like

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

and implement your Fragment like

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();   }  } 
like image 170
M D Avatar answered Sep 24 '22 06:09

M D


Adding to M D's answer:

From documentation:

A GoogleMap must be acquired using getMapAsync(OnMapReadyCallback). The MapView automatically initializes the maps system and the view.

According to this, the more correct way to initialize GoogleMap is using getMapAsync.

Note that your class has to implement 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(); } 
like image 37
Florin Avatar answered Sep 24 '22 06:09

Florin