Google Maps API v2 : 마커를 클릭 할 수있게 만드는 방법


128

Android Google Maps API v2의 마커를 클릭 할 수있게하여 옵션이있는 메뉴를 표시하거나 새로운 활동을 시작하려면 어떻게해야하나요? 앱에서 현재 "최신"방법으로 마커를 만들었다 고 생각합니다. 필요한 나머지 코드와 연결할 수 있도록 이름이나 방법을 할당하지 않았습니다.

googleMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title("My Spot")
        .snippet("This is my spot!")
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

이 질문에 답하면 고유 한 이름으로 소개 된 다음 클릭 할 수 있도록 새 활동을 열도록 설정된 마커의 샘플 코드를 포함하십시오.

답변:


238

Google Android Maps Api v2의 모든 마커를 클릭 할 수 있습니다. 마커에 추가 속성을 설정할 필요는 없습니다. 해야 할 일은 마커 클릭 콜백을 googleMap에 등록하고 콜백 내에서 클릭을 처리하는 것입니다.

public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity
    implements OnMarkerClickListener
{
    private Marker myMarker;    

    private void setUpMap()
    {
        .......
        googleMap.setOnMarkerClickListener(this);

        myMarker = googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("My Spot")
                    .snippet("This is my spot!")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        ......
    }

    @Override
    public boolean onMarkerClick(final Marker marker) {

        if (marker.equals(myMarker)) 
        {
            //handle click here
        }
    }
}

다음은 마커 맞춤 설정에 대한 Google의 유용한 가이드입니다.


9
팝업 창에서 클릭 소리를들을 수있는 방법이 있습니까? 제목 / 스 니펫을 표시하는 것?

40
마커와 같은 것-등록해야합니다 OnInfoWindowClickListenerCallback. GoogleMap에는 다음과 같은 방법이 있습니다.googleMap.setOnInfoWindowClickListener(listener);
Pavel Dudka

지금은 모두 잘 작동하지만 실수로 코드의 초기 변수로 설정하지 않은 것으로 나타났습니다. 나는 단순히 ";" 구현 코드
Malaka

1
@JDOaktown 당신은 다른 마커에 대해 다른 논리를 가지고 있다면이 점검이 필요합니다. 특정 마커를 클릭 할 때만 토스트를 표시한다고 가정합니다. 모든 마커에 대해 동일한 처리 로직이있는 경우 마커를 확인할 필요가 없습니다.
Pavel Dudka

1
문서 ( developers.google.com/android/reference/com/google/android/gms/… )에 언급 된 바와 같이 클릭이 소비 된 경우 true를 반환해야합니다. false를 반환하면 기본 동작이 발생합니다
Pavel Dudka

36

setTag(position) 지도에 마커를 추가하는 동안

Marker marker =  map.addMarker(new MarkerOptions()
                .position(new LatLng(latitude, longitude)));
marker.setTag(position);

getTag()setOnMarkerClickListener리스너

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    int position = (int)(marker.getTag());
                   //Using position get Value from arraylist 
                    return false;
                }
            });

4

액티비티 구현 OnMarkerClickListener 사용을 피하고 로컬 OnMarkerClickListener를 사용하십시오.

// Not a good idea
class MapActivity extends Activity implements OnMarkerClickListener {
}

마커에 연결된 원본 데이터 모델을 조회하려면지도가 필요합니다

private Map<Marker, Map<String, Object>> markers = new HashMap<>();

데이터 모델이 필요합니다

private Map<String, Object> dataModel = new HashMap<>();

데이터 모델에 일부 데이터를 넣습니다.

dataModel.put("title", "My Spot");
dataModel.put("snipet", "This is my spot!");
dataModel.put("latitude", 20.0f);
dataModel.put("longitude", 100.0f);

데이터 모델을 사용하여 새 마커를 만들 때 제조업체 맵에 둘 다 추가

Marker marker = googleMap.addMarker(markerOptions);
markers.put(marker, dataModel);

클릭 마커 이벤트의 경우 로컬 OnMarkerClickListener를 사용하십시오.

@Override
public void onMapReady(GoogleMap googleMap) {
    // grab for laters
    this.googleMap = googleMap;

    googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            Map dataModel = (Map)markers.get(marker);
            String title = (String)dataModel.get("title");
            markerOnClick(title);

            return false;
        }
    });

    mapView.onResume();

    showMarkers();

    ZoomAsync zoomAsync = new ZoomAsync();
    zoomAsync.execute();
}

정보 창을 표시하려면 마커 맵에서 원래 데이터 모델을 검색하십시오.

@Override
public void onMapReady(GoogleMap googleMap) {
    this.googleMap = googleMap;
    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            Map dataModel = (Map)markers.get(marker);
            String title = (String)dataModel.get("title");

            infoWindowOnClick(title);
        }
    });

OnMarkerClickListener 구현의 단점은 무엇입니까?
D.Rosado

@ D.Rosado OnMarkerClickListener는 마커를 클릭 할 때, OnInfoWindowClickListener는 정보 창을 클릭 할 때입니다. 나는 당신의 질문을 오해하고 있습니까? 각 인라인을 구현하여 setter와 동일한 코드 내에 구현을 유지하십시오.
Gary Davies

3

다른 해결책 : 제목별로 마커를 얻습니다.

public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity implements OnMarkerClickListener
{
      private Marker myMarker;    

      private void setUpMap()
      {
      .......
      googleMap.setOnMarkerClickListener(this);

      myMarker = googleMap.addMarker(new MarkerOptions()
                  .position(latLng)
                  .title("My Spot")
                  .snippet("This is my spot!")
                  .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
      ......
      }

  @Override
  public boolean onMarkerClick(final Marker marker) 
  {

     String name= marker.getTitle();

      if (name.equalsIgnoreCase("My Spot")) 
      {
          //write your code here
      }
  }
}

2

다음은 클릭 가능한 마커가 4 개인지도 활동의 전체 코드입니다. 마커를 클릭하면 정보 창이 표시되고 정보 창을 클릭하면 영어, 독일어, 스페인어 또는 이탈리아어와 같은 다른 활동으로 이동합니다. OnInfoWindowClickListener에도 불구하고 OnMarkerClickListener를 사용하려면이 줄을 바꾸면됩니다.

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

이에:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

이 줄 :

public void onInfoWindowClick(Marker arg0)

이에:

public boolean onMarkerClick(Marker arg0)

"onMarkerClick"메소드의 끝에서 :

return true;

나는 그것이 누군가에게 도움이 될 것이라고 생각한다.)

package pl.pollub.translator;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        Toast.makeText(this, "Choose a language.", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
        {

            @Override
            public void onInfoWindowClick(Marker arg0) {
                if(arg0 != null && arg0.getTitle().equals("English")){
                Intent intent1 = new Intent(MapsActivity.this, English.class);
                startActivity(intent1);}

                if(arg0 != null && arg0.getTitle().equals("German")){
                Intent intent2 = new Intent(MapsActivity.this, German.class);
                startActivity(intent2);} 

                if(arg0 != null && arg0.getTitle().equals("Italian")){
                Intent intent3 = new Intent(MapsActivity.this, Italian.class);
                startActivity(intent3);}

                if(arg0 != null && arg0.getTitle().equals("Spanish")){
                Intent intent4 = new Intent(MapsActivity.this, Spanish.class);
                startActivity(intent4);}
            }
        });
        LatLng greatBritain = new LatLng(51.30, -0.07);
        LatLng germany = new LatLng(52.3107, 13.2430);
        LatLng italy = new LatLng(41.53, 12.29);
        LatLng spain = new LatLng(40.25, -3.41);
        mMap.addMarker(new MarkerOptions()
                .position(greatBritain)
                .title("English")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(germany)
                .title("German")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(italy)
                .title("Italian")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(spain)
                .title("Spanish")
                .snippet("Click on me:)"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(greatBritain));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(germany));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(italy));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(spain));
    }
}

1
리스너가 이벤트를 소비 한 경우 true를 리턴합니다 (즉, 기본 동작이 발생하지 않아야 함). 그렇지 않으면 false입니다 (즉, 기본 동작이 발생해야 함). 기본 동작은 카메라가 마커로 이동하고 정보 창이 표시되는 것입니다.
Ariq

1
Step 1
public class TopAttractions extends Fragment implements OnMapReadyCallback, 
GoogleMap.OnMarkerClickListener

Step 2
gMap.setOnMarkerClickListener(this);

Step 3
@Override
public boolean onMarkerClick(Marker marker) {
    if(marker.getTitle().equals("sharm el-shek"))
        Toast.makeText(getActivity().getApplicationContext(), "Hamdy", Toast.LENGTH_SHORT).show();
    return false;
}

0

나는 추가 mMap.setOnMarkerClickListener(this);onMapReady(GoogleMap googleMap)방법. 따라서 마커를 클릭 할 때마다 토스트 방법에 텍스트 이름이 표시됩니다.

public class DemoMapActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_places);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    double lat=0.34924212701428;
    double lng=32.616554024713;
    String venue = "Capital Shoppers City";
    LatLng location = new LatLng(lat, lng);
    mMap.addMarker(new MarkerOptions().position(location).title(venue)).setTag(0);
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(location);
    CameraUpdate zoom = CameraUpdateFactory.zoomTo(16);
    mMap.moveCamera(cameraUpdate);
    mMap.animateCamera(zoom);
    mMap.setOnMarkerClickListener(this);
}

@Override
public boolean onMarkerClick(final Marker marker) {
    // Retrieve the data from the marker.
    Integer clickCount = (Integer) marker.getTag();

    // Check if a click count was set, then display the click count.
    if (clickCount != null) {
        clickCount = clickCount + 1;
        marker.setTag(clickCount);
        Toast.makeText(this,
                       marker.getTitle() +
                       " has been clicked ",
                       Toast.LENGTH_SHORT).show();
    }
    // Return false to indicate that we have not consumed the event and that we wish
    // for the default behavior to occur (which is for the camera to move such that the
    // marker is centered and for the marker's info window to open, if it has one).
    return false;
}

}

마커 를 참조 마커로 확인할 수 있습니다


-4

위의 예제를 편집했습니다 ...

public class YourActivity extends implements OnMarkerClickListener
{
    ......

    private void setMarker()
    {
        .......
        googleMap.setOnMarkerClickListener(this);

        myMarker = googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("My Spot")
                    .snippet("This is my spot!")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        ......
    }

    @Override
    public boolean onMarkerClick(Marker marker) {

       Toast.makeText(this,marker.getTitle(),Toast.LENGTH_LONG).show();
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.