Google Maps API v2: İşaretçiler nasıl tıklanabilir hale getirilir?


128

Android Google Maps API v2'deki işaretçileri tıklanabilir hale nasıl getirebilirim, böylece seçenekler içeren bir menü açar veya yeni bir etkinlik başlatırlar? Şu anda uygulamamdaki işaretçileri "newb" yöntemiyle yaptığımı düşünüyorum. Onlara gerekli kodun geri kalanıyla bağlantı kurabilmeleri için bir ad veya yöntem atamadım.

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

Bunu CEVAPLARsanız, lütfen benzersiz bir adla tanıtılan ve ardından yeni bir etkinlik açmak için tıklanabilir olarak ayarlanan bir işaretleyicinin örnek kodunu ekleyin.

Yanıtlar:


238

Google Android Maps Api v2'deki tüm işaretçiler tıklanabilir. İşaretçinize herhangi bir ek özellik ayarlamanıza gerek yoktur. Yapmanız gereken şey - işaretçi tıklama geri aramasını googleMap'inize kaydetmek ve geri aramada tıklamayı ele almaktır:

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

işte işaretçi özelleştirme hakkında google'da iyi bir kılavuz


9
Açılır pencereye yapılan tıklamaları dinlemenin bir yolu var mı? Başlığınızı / pasajınızı görüntüleyen mi?

40
işaretçilerle aynı şey - kayıt olmanız gerekir OnInfoWindowClickListenerCallback. GoogleMap'te bunun için bir yöntem var:googleMap.setOnInfoWindowClickListener(listener);
Pavel Dudka 9'13

Şimdilik hepsi çok iyi çalışıyor, hatamın kodda daha önce bir değişken olarak ayarlamamak olduğunu fark ettim. Ben sadece ";" ve uygulanan kod
Malaka

1
@JDOaktown, farklı belirteçler için farklı mantığınız varsa bu kontrole ihtiyacınız var. Sadece belirli bir işaretçi tıklandığında bir tost göstermek istediğinizi varsayalım. Tüm işaretçileriniz için aynı işleme mantığına sahipseniz - işaretleyiciyi kontrol etmenize gerek yoktur
Pavel Dudka

1
Belgelerde belirtildiği gibi ( developer.google.com/android/reference/com/google/android/gms/… ), tıklama tüketildiyse doğru döndürmeniz gerekir. Yanlış döndürürseniz - varsayılan davranış oluşur
Pavel Dudka

36

setTag(position) haritaya işaretçi eklerken.

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

getTag()üzerinde setOnMarkerClickListenerdinleyici

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

Activity uygulamalarını kullanmaktan kaçının OnMarkerClickListener, yerel bir OnMarkerClickListener kullanın

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

İşaretçiye bağlı orijinal veri modelini aramak için bir haritaya ihtiyacınız olacak

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

Bir veri modeline ihtiyacınız olacak

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

Veri modeline biraz veri koyun

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

Bir veri modeli kullanarak yeni bir işaretçi oluştururken her ikisini de üretici haritasına ekleyin

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

Tıklama işaretleyici olayı için yerel bir OnMarkerClickListener kullanın:

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

Bilgi penceresini görüntülemek için orijinal veri modelini işaret haritasından alın:

@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 uygulamasının sakıncaları nelerdir?
D.Rosado

@ D.Rosado OnMarkerClickListener, işaretleyiciye tıklandığında kullanılır, OnInfoWindowClickListener, bilgi penceresi tıklandığında kullanılır. Sorunuzu yanlış mı anlıyorum? Uygulamayı ayarlayıcı ile aynı kod içinde tutmak için her bir satır içi uygulayın.
Gary Davies

3

Başka bir Çözüm: Markörü başlığına göre alırsınız

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

İşte 4 tıklanabilir işaretçi içeren bir harita etkinliği kodum. Bir işaretleyiciye tıkladığınızda bir bilgi penceresi gösterilir ve bilgi penceresine tıkladıktan sonra başka bir etkinliğe geçersiniz: İngilizce, Almanca, İspanyolca veya İtalyanca. OnInfoWindowClickListener'e rağmen OnMarkerClickListener'ı kullanmak istiyorsanız, sadece bu satırı takas etmeniz gerekir:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

buna:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

bu hat:

public void onInfoWindowClick(Marker arg0)

buna:

public boolean onMarkerClick(Marker arg0)

ve "onMarkerClick" yönteminin sonunda:

return true;

Birisi için yararlı olabileceğini düşünüyorum;)

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
dinleyici olayı tüketmişse true döndür (yani, varsayılan davranış gerçekleşmemelidir); aksi takdirde false (yani, varsayılan davranış meydana gelmelidir). Varsayılan davranış, kameranın işaretleyiciye hareket etmesi ve bir bilgi penceresinin görünmesidir.
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

Bir ilave mMap.setOnMarkerClickListener(this);olarak onMapReady(GoogleMap googleMap)bir yöntem. Böylece, bir işaretçiye her tıkladığınızda, tost yöntemindeki metin adını görüntüler.

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

}

Referans İşaretleri için bu bağlantıyı kontrol edebilirsiniz


-4

Yukarıdaki örneği düzenledim ...

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();
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.