Google Maps API v2: как сделать маркеры кликабельными?
Как сделать маркеры в Android Google Maps API v2 становятся кликабельными, поэтому они либо вызовут меню с опциями, либо просто начнут новую деятельность? Я считаю, что я сделал маркеры в моем приложении в настоящее время в методе "newb". Я не присвоить им имя или метод, чтобы иметь возможность связать его с остальной код.
googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title("My Spot")
.snippet("This is my spot!")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
Если вы ответите на этот вопрос, пожалуйста, включите пример кода маркера вводится с уникальным именем, а затем устанавливается как кликабельный, чтобы открыть новый вид деятельности.
6 ответов:
все маркеры в Google Android Maps Api v2 являются интерактивными. Вам не нужно устанавливать никаких дополнительных свойств для вашего маркера. Что вам нужно сделать - это зарегистрироваться маркера нажмите кнопку обратного вызова, чтобы ваш расчет и ручки нажмите кнопку в обратного вызова:
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 о настройке маркера
setTag(position)при добавлении маркера на карту.Marker marker = map.addMarker(new MarkerOptions() .position(new LatLng(latitude, longitude))); marker.setTag(position);
getTag()onsetOnMarkerClickListenerслушательmap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { int position = (int)(marker.getTag()); //Using position get Value from arraylist return false; } });
избегайте использования Activity implements 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);для события on click marker используйте локальный 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); } });
другое решение : вы получаете маркер по ее названию
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 } }}
вот весь мой код активности карты с 4 кликабельными маркерами. Нажмите на маркер показывает информационное окно, и после нажатия на информационное окно вы переходите к другой деятельности: английский, немецкий, испанский или итальянский. Если вы хотите использовать OnMarkerClickListener, несмотря на OnInfoWindowClickListener, вам просто нужно поменять эту строку:
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)); } }
я отредактировал приведенный выше пример...
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(); } }
Comments