Android Google Maps V2 – OnInfoWindowClick на нескольких маркерах

У меня есть код, чтобы один маркер начал активность, когда вы нажимаете на инфунд. Он работает абсолютно нормально. Но когда я пытаюсь добавить в другой маркер и другой @override, он всегда открывает последний класс во всех окнах Markers. Таким образом, по сути, все маркеры infowindows открывают одну и ту же активность при нажатии, а не открывают отдельный класс, на который я намеревался это сделать.

Это код ниже, который успешно открывает 1 активность в InfoWindowClicked. Я назвал его example.class, это для всех, кому нужен этот пример .

public class MainActivity extends Activity implements OnInfoWindowClickListener { private GoogleMap googlemap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(isGooglePlay()){ setContentView(R.layout.activity_main); setUpMap(); { } } googlemap.addMarker(new MarkerOptions() .position(new LatLng(0,-0)) .title("Title") .snippet("Snippet") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { Intent intent = new Intent(MainActivity.this,Example.class); startActivity(intent); } }); { 

Таким образом, под GoogleMap googlemap / mMap (или как вы это называете) и @override void Oncreate (мое приложение запускается только в том случае, если доступно приложение GooglePlayServices, ваше может быть не так) вы можете поместить маркер и код infowindowclick.

Удостоверьтесь, что где-то в коде есть также (обычно в private void setUpMap () {)

  googlemap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap(); 

Ниже приведен код с двумя маркерами, но оба они открывают example2.class при нажатии. Может кто-нибудь помочь мне понять это, чтобы я мог их разделить и открыть ли они разные классы?

  googlemap.addMarker(new MarkerOptions() .position(new LatLng(0,-0)) .title("Title") .snippet("Snippet") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { Intent intent = new Intent(MainActivity.this,Example.class); startActivity(intent); } }); { { googlemap.addMarker(new MarkerOptions() .position(new LatLng( 0, -0)) .title("Title") .snippet("Snippet") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { Intent intent = new Intent(MainActivity.this,Example2.class); startActivity(intent); } }); }} } 

Редактировать (07/06/2013):

 private GoogleMap googlemap; private Map<Marker, Class> allMarkersMap = new HashMap<Marker, Class>(); 

Вышеуказанное относится к уровню класса ^^^

  Marker marker1 = googlemap.addMarker(new MarkerOptions() .position(new LatLng(0,0)) .title("England") .snippet("London") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); allMarkersMap.put(marker1, Contact.class); } public void onInfoWindowClick(Marker marker) { Class cls = allMarkersMap.get(marker); Intent intent = new Intent(MainActivity.this, cls); startActivity(intent); } 

Вышеупомянутый ^^^^ находится под моей «защищенной пустотой onCreate (Bundle savedInstanceState) {". Нет ошибок, когда я отлаживаю, я могу видеть маркер, но не могу нажать на InfoWindow. Предупреждения:

 Class is a raw type. References to generic type Class<T> should be parameterized 

Я дважды вижу это предупреждение на уровне класса и один раз в публичной пустоте onInfoWindowClick на слове «Класс» . Я пробовал несколько разных вещей, таких как «Добавить типы аргументов в« Класс », но это не сработало. На маркерном марке в публичной пустоте я изменил маркер на маркер 1 и на строку ниже allMarkersMap.get (marker), изменил ( Маркер) до (marker1), чтобы попробовать, но это не сработало. Есть ли что-нибудь еще, что я могу сделать, чтобы попытаться инициализировать функцию onInfoWindowClick?

Из справки MaciejGórski здесь приведен пример того, что разные классы (действия, например, страницы) открываются, когда вы нажимаете отдельные инфо-окна Marker на GoogleMapsV2:

Добавьте это на свой уровень в GoogleMap:

 private GoogleMap googlemap/mMap (or whatever you call yours); private Map<Marker, Class> allMarkersMap = new HashMap<Marker, Class>(); 

Под защищенным void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Введите свои маркеры:

  Marker marker = googlemap.addMarker(new MarkerOptions() .position(new LatLng(0,-0)) .title("London") .snippet("North London") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); allMarkersMap.put(marker, NorthLondon.class); googlemap.setOnInfoWindowClickListener(this); Marker marker1 = googlemap.addMarker(new MarkerOptions() .position(new LatLng(0244534,-1232312)) .title("USA") .snippet("Washington") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); allMarkersMap.put(marker1, Washington.class); googlemap.setOnInfoWindowClickListener(this); Marker marker2 = googlemap.addMarker(new MarkerOptions() .position(new LatLng(42343244,-0.334322)) .title("Italy") .snippet("Rome")); allMarkersMap.put(marker2, Rome.class); googlemap.setOnInfoWindowClickListener(this); } public void onInfoWindowClick(Marker marker) { Class cls = allMarkersMap.get(marker); Intent intent = new Intent(MainActivity.this, cls); startActivity(intent); } 

Вышеупомянутые – отдельные маркеры. Если бы я должен был создать еще один, я бы назвал его маркером-маркером3, затем 4,5 экт … Где он запрашивает класс в allMarkersMap.put (marker, .class); Введите желаемый класс, чтобы он открыл то, что вы хотите. Выделите общедоступный код OnInfoWindowClick под маркерами где-то, это обратный вызов.

Вот и все. Когда вы нажимаете на InfoWindows в маркерах, они должны открыть класс активности, который вы поместили в код MarkerOptions!

Кредит для этого относится к MaciejGórski

Слово, set в setOnInfoWindowClickListener означает, что оно переопределяет любое значение, которое было set ранее. Эта функция вызывается в объекте GoogleMap и потому, что есть один объект GoogleMap , есть один OnInfoWindowClickListener .

Способ, которым вы работаете с ним, – это решить, что происходит на основе параметра в onInfoWindowClick(Marker marker) используя if else , switch или, возможно, Map<Marker, Class> :

 public void onInfoWindowClick(Marker marker) { Class cls = map.get(marker); Intent intent = new Intent(MainActivity.this, cls); startActivity(intent); } 

Конечно, вы должны сначала инициализировать эту карту:

 Marker marker1 = googlemap.addMarker... map.put(marker1, Example.class); 

Редактировать:

 // on the class level: private Map<Marker, Class> allMarkersMap = new HashMap<Marker, Class>(); // in the onCreate or elsewhere Marker marker1 = googlemap.addMarker(new MarkerOptions() .position(new LatLng(0,-0)) .title("Netherlands") .snippet("Amsterdam") .icon(BitmapDescriptorFactory.fromResource(R.drawable.star))); allMarkersMap.put(marker1, Example.class); // callback public void onInfoWindowClick(Marker marker) { Class cls = allMarkersMap.get(marker); Intent intent = new Intent(MainActivity.this, cls); startActivity(intent); } 

Для проблемы:

 Class is a raw type. References to generic type Class<T> should be parameterized 

Я добавляю <? > Рядом с классом:

 private Map<Marker, Class<?>> allMarkersMap = new HashMap<Marker, Class<?>>(); 

а также

 Class<?> cls = allMarkersMap.get(marker); 

И если вы уже работаете в классе фрагментов (например, со мной), вы измените:

 public void onInfoWindowClick(Marker marker) { Class<?> cls = allMarkersMap.get(marker); Intent intent = new Intent(getActivity(), cls); startActivity(intent); }