Intereting Posts
Ошибка Adreno 220 GLSL Как вызвать getResources () из класса, который не имеет контекста? Как ограничить мое приложение для Android не-планшетами? В Android, можно ли перехватить ключевые события во всем мире, прежде чем они достигнут вид ребенка, который имеет фокус? Кордова Камера для съемки нескольких фотографий один за другим Cordova 3.0 FileWriter THREAD WARNING: exec () вызов File.write заблокировал основной поток … должен использовать CordovaInterface.getThreadPool () Android: включить su бинарный исполняемый файл в сборке AOSP Как запустить службу при загрузке в Android 2.3 (Gingerbread) без сбоев Пользовательский ImageView с тенью Как читать данные MMS на Android? Проблема совместного использования схемы: иногда я получаю сообщение «Невозможно загрузить изображение» Скорость Android основана на значениях акселерометра Добавление внешней библиотеки в студию Android 0.3.6 Как удалить значок настроек в правом верхнем углу панели действий? Android намерен открыть «Активность для хранения данных»

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