Google Maps v2 Marker zOrdering - Set to top
Aiden Fry's answer works if you do actually display an InfoWindow. If you don't, the marker won't come to the front. Here is a hack to make it come to the front anyway:
Create a custom InfoWindowAdapter that displays a 0dp info window:
public class MapWindowAdapter implements GoogleMap.InfoWindowAdapter { private Context context = null; public MapWindowAdapter(Context context) { this.context = context; } // Hack to prevent info window from displaying: use a 0dp/0dp frame @Override public View getInfoWindow(Marker marker) { View v = ((Activity) context).getLayoutInflater().inflate(R.layout.no_info_window, null); return v; } @Override public View getInfoContents(Marker marker) { return null; }}
Here is the code for the layout:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="0dp" android:layout_height="0dp"></LinearLayout>
When you set up your map, set the adapter and custom InfoWindowAdapter and OnMarkerClickListener (using showInfoWindow and returning true as AIden Fry advised):
mMap.setInfoWindowAdapter(new MapWindowAdapter(this));//Call showInfoWindow to put marker on top of others.myMarker.showInfoWindow();
This is not beautiful, but I didn't find any other way to deal with z-indexing without using info windows.
This was added in Google Play Services 9.2 (June 27, 2016)
The new
MarkerOptions.zIndex()
sets the stack order of a marker in relation to other markers on the map. Read more about marker z-indexes and the effect of z-index on click events. (Issue 4688)
Whilst not the perfect solution! I have figured out how to show a selected (tapped) marker over all other markers by consuming the onMarkerClick event. Returning TRUE will consume this event, so we have to do the showInfoWindow and zoom to center
@Override public boolean onMarkerClick(Marker marker) { //Manually open the window marker.showInfoWindow(); //Animate to center sMapFrag_v2.getMap().animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition()); //Consume the method return true; }