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.
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.
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
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 Fragment
s.
You may follow this comment on how to add nested SupportMapFragment
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With