Google Maps API v2: Bagaimana membuat marker dapat diklik?

128

Bagaimana cara membuat penanda di Android Google Maps API v2 menjadi dapat diklik sehingga mereka akan memunculkan menu dengan opsi atau hanya memulai aktivitas baru? Saya yakin saya membuat penanda di aplikasi saya saat ini dalam metode "newb". Saya tidak memberi mereka nama atau metode untuk dapat menghubungkannya dengan sisa kode yang diperlukan.

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

Jika Anda JAWABAN ini, harap sertakan kode sampel penanda yang diperkenalkan dengan nama unik dan kemudian disetel sebagai dapat diklik untuk membuka aktivitas baru.

Malaka
sumber

Jawaban:

238

Semua penanda di Google Android Maps Api v2 dapat diklik. Anda tidak perlu mengatur properti tambahan apa pun ke marker Anda. Yang perlu Anda lakukan - adalah mendaftarkan callback klik marker ke googleMap Anda dan menangani klik di dalam callback:

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
        }
    }
}

di sini adalah panduan yang bagus di google tentang kustomisasi marker

Pavel Dudka
sumber
9
Apakah ada cara untuk mendengarkan klik di jendela sembulan? Yang menampilkan judul / cuplikan Anda?
40
hal yang sama dengan spidol - Anda harus mendaftar OnInfoWindowClickListenerCallback. Ada metode di GoogleMap untuk itu:googleMap.setOnInfoWindowClickListener(listener);
Pavel Dudka
Semuanya bekerja dengan sangat baik untuk saat ini, saya perhatikan kesalahan saya tidak menetapkannya sebagai variabel sebelumnya dalam kode. Saya hanya lupa ";" dan kode yang diterapkan
Malaka
1
@ JDOaktown Anda memerlukan pemeriksaan ini jika Anda memiliki logika berbeda untuk berbagai penanda. Katakanlah Anda hanya ingin bersulang ketika marker tertentu diklik. Jika Anda memiliki logika penanganan yang sama untuk semua marker Anda - Anda tidak perlu memeriksa marker
Pavel Dudka
1
Seperti disebutkan dalam dokumentasi ( developers.google.com/android/reference/com/google/android/gms/… ), Anda perlu mengembalikan true jika klik dikonsumsi. Jika Anda mengembalikan false - perilaku default akan terjadi
Pavel Dudka
36

setTag(position) sambil menambahkan penanda ke peta.

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

getTag()pada setOnMarkerClickListenerpendengar

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

Hindari menggunakan Aktivitas mengimplementasikan OnMarkerClickListener, gunakan OnMarkerClickListener lokal

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

Anda akan membutuhkan peta untuk mencari model data asli yang terhubung ke penanda

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

Anda akan membutuhkan model data

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

Masukkan beberapa data ke dalam model data

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

Saat membuat penanda baru menggunakan model data, tambahkan keduanya ke peta pembuat

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

Untuk acara penanda klik, gunakan OnMarkerClickListener lokal:

@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();
}

Untuk menampilkan jendela info ambil model data asli dari peta penanda:

@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);
        }
    });
Gary Davies
sumber
Apa kelemahan dari implementasi OnMarkerClickListener?
D.Rosado
@ D.Rosado OnMarkerClickListener adalah untuk ketika marker diklik, OnInfoWindowClickListener adalah ketika jendela info diklik. Apakah saya salah mengerti pertanyaan Anda? Terapkan setiap inline untuk menjaga implementasi di dalam kode yang sama dengan setter.
Gary Davies
3

Solusi Lain: Anda mendapatkan penanda berdasarkan judulnya

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
      }
  }
}
Osama Ibrahim
sumber
2

Ini seluruh kode saya dari aktivitas peta dengan 4 marker yang dapat diklik. Klik pada penanda menunjukkan jendela info, dan setelah klik pada jendela info Anda akan pergi ke aktivitas lain: Inggris, Jerman, Spanyol atau Italia. Jika Anda ingin menggunakan OnMarkerClickListener walaupun OnInfoWindowClickListener, Anda hanya perlu menukar baris ini:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

untuk ini:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

garis ini:

public void onInfoWindowClick(Marker arg0)

untuk ini:

public boolean onMarkerClick(Marker arg0)

dan di akhir metode "onMarkerClick":

return true;

Saya pikir ini mungkin bermanfaat untuk seseorang;)

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));
    }
}
Pysia93
sumber
1
mengembalikan true jika pendengar telah mengkonsumsi acara (yaitu, perilaku default seharusnya tidak terjadi); false sebaliknya (yaitu, perilaku default harus terjadi). Perilaku default adalah kamera untuk pindah ke penanda dan jendela info muncul.
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;
}
Hamdy Abd El Fattah
sumber
0

Saya menambahkan mMap.setOnMarkerClickListener(this);di onMapReady(GoogleMap googleMap)metode. Jadi setiap kali Anda mengklik penanda, ini akan menampilkan nama teks dalam metode bersulang.

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;
}

}

Anda dapat memeriksa tautan ini untuk Penanda referensi

Nelson Katale
sumber
-4

Saya telah mengedit contoh di atas yang diberikan ...

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();
    }
}
Abdul Rizwan
sumber