Google Maps Android API v2 - Interactive InfoWindow (like in original android google maps)

前端 未结 7 1649
眼角桃花
眼角桃花 2020-11-22 01:41

I am trying to a make custom InfoWindow after a click on a marker with the new Google Maps API v2. I want it to look like in the original maps application by Go

相关标签:
7条回答
  • 2020-11-22 02:46

    For those who couldn't get choose007's answer up and running

    If clickListener is not working properly at all times in chose007's solution, try to implement View.onTouchListener instead of clickListener. Handle touch event using any of the action ACTION_UP or ACTION_DOWN. For some reason, maps infoWindow causes some weird behaviour when dispatching to clickListeners.

    infoWindow.findViewById(R.id.my_view).setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
              int action = MotionEventCompat.getActionMasked(event);
              switch (action){
                    case MotionEvent.ACTION_UP:
                        Log.d(TAG,"a view in info window clicked" );
                        break;
                    }
                    return true;
              }
    

    Edit : This is how I did it step by step

    First inflate your own infowindow (global variable) somewhere in your activity/fragment. Mine is within fragment. Also insure that root view in your infowindow layout is linearlayout (for some reason relativelayout was taking full width of screen in infowindow)

    infoWindow = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
    /* Other global variables used in below code*/
    private HashMap<Marker,YourData> mMarkerYourDataHashMap = new HashMap<>();
    private GoogleMap mMap;
    private MapWrapperLayout mapWrapperLayout;
    

    Then in onMapReady callback of google maps android api (follow this if you donot know what onMapReady is Maps > Documentation - Getting Started )

       @Override
        public void onMapReady(GoogleMap googleMap) {
           /*mMap is global GoogleMap variable in activity/fragment*/
            mMap = googleMap;
           /*Some function to set map UI settings*/ 
            setYourMapSettings();
    

    MapWrapperLayout initialization http://stackoverflow.com/questions/14123243/google-maps-android-api-v2- interactive-infowindow-like-in-original-android-go/15040761#15040761 39 - default marker height 20 - offset between the default InfoWindow bottom edge and it's content bottom edge */

            mapWrapperLayout.init(mMap, Utils.getPixelsFromDp(mContext, 39 + 20));
    
            /*handle marker clicks separately - not necessary*/
           mMap.setOnMarkerClickListener(this);
    
           mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                    @Override
                    public View getInfoWindow(Marker marker) {
                        return null;
                    }
    
                @Override
                public View getInfoContents(Marker marker) {
                    YourData data = mMarkerYourDataHashMap.get(marker);
                    setInfoWindow(marker,data);
                    mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
                    return infoWindow;
                }
            });
        }
    

    SetInfoWindow method

    private void setInfoWindow (final Marker marker, YourData data)
                throws NullPointerException{
            if (data.getVehicleNumber()!=null) {
                ((TextView) infoWindow.findViewById(R.id.VehicelNo))
                        .setText(data.getDeviceId().toString());
            }
            if (data.getSpeed()!=null) {
                ((TextView) infoWindow.findViewById(R.id.txtSpeed))
                        .setText(data.getSpeed());
            }
    
            //handle dispatched touch event for view click
            infoWindow.findViewById(R.id.any_view).setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = MotionEventCompat.getActionMasked(event);
                    switch (action) {
                        case MotionEvent.ACTION_UP:
                            Log.d(TAG,"any_view clicked" );
                            break;
                    }
                    return true;
                }
            });
    

    Handle marker click separately

        @Override
        public boolean onMarkerClick(Marker marker) {
            Log.d(TAG,"on Marker Click called");
            marker.showInfoWindow();
            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(marker.getPosition())      // Sets the center of the map to Mountain View
                    .zoom(10)
                    .build();
            mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),1000,null);
            return true;
        }
    
    0 讨论(0)
提交回复
热议问题