Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use google map V2 inside fragment?

I have a fragment which is a part of Viewpager, and I want to use Google Map V2 inside that fragment. This is what I have tried so far,

In my fragment,

    private SupportMapFragment map;       private GoogleMap mMapView;     @Override     public void onActivityCreated(Bundle savedInstanceState) {         // TODO Auto-generated method stub         super.onActivityCreated(savedInstanceState);          FragmentManager fm = getChildFragmentManager();         map = (SupportMapFragment) fm.findFragmentById(R.id.map);         if (map == null) {             map = SupportMapFragment.newInstance();             fm.beginTransaction().replace(R.id.map, map).commit();         }        }      @Override     public void onResume() {         super.onResume();         if (mMapView == null) {             mMapView = map.getMap();             Marker hamburg = mMapView.addMarker(new MarkerOptions().position(HAMBURG)                       .title("Hamburg"));                   Marker kiel = mMapView.addMarker(new MarkerOptions()                       .position(KIEL)                       .title("Kiel")                       .snippet("Kiel is cool")                       .icon(BitmapDescriptorFactory                           .fromResource(R.drawable.ic_launcher)));                     mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));                    // Zoom in, animating the camera.            mMapView.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);           }     } 

and in my layout subfragment_info.xml , I have,

<fragment             android:id="@+id/map"             class="com.google.android.gms.maps.SupportMapFragment"             android:layout_width="match_parent"             android:layout_height="300dp"             android:layout_alignParentLeft="true"             android:layout_below="@+id/tableLayout1" /> 

I can see the map now. But the markers are not showing. I think my Google map mMapView is null. Please help me to get this problem solved. Thanks in advance.

like image 258
Basim Sherif Avatar asked Aug 13 '13 10:08

Basim Sherif


People also ask

What is SupportMapFragment?

public class SupportMapFragment 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.


2 Answers

Create a frame for map in which it will be added in your xml layout

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/map_container">  <!-- The map fragments will go here -->  </RelativeLayout> 

Don't include class="com.google.android.gms.maps.SupportMapFragment" in xml either in your fragment class do get it manually inside onActivityCreated

    @Override public void onActivityCreated(Bundle savedInstanceState) {     super.onActivityCreated(savedInstanceState);     FragmentManager fm = getChildFragmentManager();     fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);     if (fragment == null) {         fragment = SupportMapFragment.newInstance();         fm.beginTransaction().replace(R.id.map_container, fragment).commit();     }   /***at this time google play services are not initialize so get map and add what ever you want to it in onResume() or onStart() **/ }  @Override     public void onResume() {         super.onResume();         if (map == null) {             map = fragment.getMap();             map.addMarker(new MarkerOptions().position(new LatLng(0, 0)));         }     } 

if you guys face any problem Illegal State Exception Occur just write below code

/* * This issue Is tracked in (Google Bugs) * http://code.google.com/p/gmaps-api-issues/issues/detail?id=5064 Added * Code Due to Illegal State Exception Occur when reclicking on tab * * A short-term workaround that fixed it for me is to add the following to * onDetach() of every Fragment which you call */

@Override     public void onDetach() {         super.onDetach();          try {             Field childFragmentManager = Fragment.class                     .getDeclaredField("mChildFragmentManager");             childFragmentManager.setAccessible(true);             childFragmentManager.set(this, null);          } catch (NoSuchFieldException e) {             throw new RuntimeException(e);         } catch (IllegalAccessException e) {             throw new RuntimeException(e);         }     } 

//If you want to show map in activity just extend your Activity by //FragmentActivity write code mention below

In onCreate

FragmentManager fm = getSupportFragmentManager();         fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);         if (fragment == null) {             fragment = SupportMapFragment.newInstance();             fm.beginTransaction().replace(R.id.map_container, fragment)                     .commit();     } 

In onResume

@Override     protected void onResume() {         super.onResume();         if (googleMap == null) {             initilizeMap();          }     }  private void initilizeMap() {         if (googleMap != null) {              googleMap = fragment.getMap();             googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);             googleMap.getUiSettings().setMyLocationButtonEnabled(true);             googleMap.getUiSettings().setCompassEnabled(true);             googleMap.getUiSettings().setRotateGesturesEnabled(true);              CameraPosition cameraPosition = new CameraPosition.Builder()                     .target(new LatLng(latitude, longitude)).zoom(10).build();             googleMap.animateCamera(CameraUpdateFactory                     .newCameraPosition(cameraPosition));              // create marker             MarkerOptions marker = new MarkerOptions().position(new LatLng(                     latitude, longitude));             // ROSE color icon             marker.icon(BitmapDescriptorFactory                     .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));             // adding marker             googleMap.addMarker(marker);              // check if map is created successfully or not             if (googleMap == null) {                 Toast.makeText(getApplicationContext(),                         "Sorry! unable to create maps", Toast.LENGTH_SHORT)                         .show();             }         }     } 

Additional help can get from these links
https://code.google.com/p/gmaps-api-issues/issues/detail?id=5064#c1 https://developers.google.com/maps/documentation/android/map

like image 154
DeepakPanwar Avatar answered Sep 23 '22 13:09

DeepakPanwar


You have to decide if you create your fragment in code new SupportMapFragment() or inflate from xml class="com.google.android.gms.maps.SupportMapFragment".

Actually you cannot have a Fragment in xml for another Fragment. Read about nested Fragments.

You may follow this comment on how to add nested SupportMapFragment.

like image 31
MaciejGórski Avatar answered Sep 19 '22 13:09

MaciejGórski