Search code examples
androidkotlinandroid-maps-v2

Android Maps v2 - Info Window click not working despite listener present


I'm trying to get a Toast to appear depending on which InfoWindow was clicked. I've already implemented the click listeners for each InfoWindow but for reason none of them do anything when clicked. I also tried 2 different methods individually (mGoogleMap.setOnInfoWindowClickListener) and (override fun onInfoWindowClick) but still had no success.

class MyFragment : androidx.fragment.app.Fragment(), GoogleMap.OnInfoWindowClickListener, OnMapReadyCallback {
    private lateinit var mGoogleMap: GoogleMap
    private lateinit var mMapView: MapView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val v = inflater.inflate(R.layout.my_fragment, container, false)

        mMapView = v.map_location
        mMapView.onCreate(savedInstanceState)
        mMapView.getMapAsync(this)

        return v
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mGoogleMap = googleMap
        mGoogleMap.mapType = GoogleMap.MAP_TYPE_NORMAL


        val locationA = LatLng(44.862390, -0.550287)
        mGoogleMap.addMarker(
            MarkerOptions()
                .position(locationA)
                .title("Location A")
        )

        val locationB = LatLng(44.863089, -0.551417)
        mGoogleMap.addMarker(
            MarkerOptions()
                .position(locationB)
                .title("Location B")
        )

        mGoogleMap.setOnInfoWindowClickListener { marker ->
            if (marker.equals(locationA)) {
                Toast.makeText(activity, "A", Toast.LENGTH_SHORT).show()
            } else if (marker.equals(locationB)) {
                Toast.makeText(activity, "B", Toast.LENGTH_SHORT).show()
            }
        }

        val cameraUpdate = CameraUpdateFactory.newLatLngZoom(LatLng(44.862716, -0.550763), 18f)
    }

    override fun onInfoWindowClick(marker: Marker?) {
        if (marker != null) {
            if (marker.id == "locationA") {
                Toast.makeText(activity, "A", Toast.LENGTH_SHORT).show()
            }
            else if (marker.id == "locationB") {
                Toast.makeText(activity, "B", Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onResume() {
        super.onResume()
        mMapView.onResume()
    }

    override fun onPause() {
        super.onPause()
        mMapView.onPause()
    }

    override fun onDestroy() {
        super.onDestroy()
        mMapView.onDestroy()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mMapView.onSaveInstanceState(outState)
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mMapView.onLowMemory()
    }
}

Solution

  • you are comparing LatLng with Marker, it cannot works.

    you should for example compare the marker titles:

    override fun onMapReady(googleMap: GoogleMap) {
        mGoogleMap = googleMap
        mGoogleMap.mapType = GoogleMap.MAP_TYPE_NORMAL
    
    
        val locationA = LatLng(44.862390, -0.550287)
        // markerA is a variable of your fragment
        markerA = mGoogleMap.addMarker(
            MarkerOptions()
                .position(locationA)
                .title("Location A")
        )
    
        val locationB = LatLng(44.863089, -0.551417)
        // markerB is a variable of your fragment
        markerB = mGoogleMap.addMarker(
            MarkerOptions()
                .position(locationB)
                .title("Location B")
        )
    
        mGoogleMap.setOnInfoWindowClickListener { marker ->
            onMarkerClick(marker)
        }
    
        val cameraUpdate = CameraUpdateFactory.newLatLngZoom(LatLng(44.862716, -0.550763), 18f)
    }
    
    override fun onInfoWindowClick(marker: Marker?) {
        if (marker != null) {
            onMarkerClick(marker)
        }
    }
    
    private fun onMarkerClick(marker: Marker) {
            if (marker.id == markerA.id) {
                Toast.makeText(activity, "A", Toast.LENGTH_SHORT).show()
            } else if (marker.id == markerB.id) {
                Toast.makeText(activity, "B", Toast.LENGTH_SHORT).show()
            }
        }
    }