Ну, каждый маркер в моем приложении будет представлять пользователя, поэтому мне нужно идентифицировать этого пользователя, когда я нажимаю информационное окно, чтобы получить его данные из Интернета, и я не могу определить его по имени по очевидным причинам, Можно ли добавить дополнительный атрибут к объекту-маркеру? спасибо!
Добавить идентификацию маркера на google maps v2 api для Android
Ответ 1
Вы можете сделать HashMap<Marker, User>
проверьте этот учебник: http://bon-app-etit.blogspot.be/2012/12/add-informationobject-to-marker-in.html
Ответ 2
Можно ли добавить дополнительный атрибут к объекту-маркеру?
Нет. Marker
- final
. Кроме того, создаваемые объекты Marker
исчезают быстро, поскольку они используются только для некоторых IPC в приложении Google Play Services. Объект Marker
, который вы получаете в своем OnInfoWindowClickListener
, кажется, является восстановленной копией.
У меня есть субтитры в поле фрагмента, поэтому не вариант.
Конечно. Сохраните субтитры где-нибудь еще и поместите свой ключ в свой пользователь в субтитрах. Когда вы выведете InfoWindow
из своего InfoWindowAdapter
, потяните субтитры.
Ответ 3
Я не думаю, что это хорошая идея, чтобы сохранить сильные ссылки на маркеры через карту. Поскольку вы в любом случае используете свой пользовательский оконный адаптер для визуализации содержимого, вы можете "злоупотреблять" фрагментом() или заголовком() на MarkerOptions для хранения вашей информации. Они оба являются строками, поэтому в зависимости от информации, которую вы храните, вы будете немного использовать больше памяти, с другой стороны вы будете в безопасности от утечек памяти, удерживая ссылки на маркеры.
Кроме того, вы соглашаетесь с тем, как Карты управляют этой устойчивостью во время остановок и возобновлений.
Ответ 4
Вот несколько более простое решение, которое я реализовал. Все, что вы делаете, это Create a InfoWindowAdapter, который берет то, что вы хотите передать в его конструктор.
class CustomWindowAdapter implements InfoWindowAdapter{
LayoutInflater mInflater;
private HashMap<Marker, Double> mRatingHash;
public CustomWindowAdapter(LayoutInflater i, HashMap<Marker, Double> h){
mInflater = i;
mRatingHash = h;
}
@Override
public View getInfoContents(Marker marker) {
// Getting view from the layout file
View v = mInflater.inflate(R.layout.custom_info_window, null);
TextView title = (TextView) v.findViewById(R.id.tv_info_window_title);
title.setText(marker.getTitle());
TextView description = (TextView) v.findViewById(R.id.tv_info_window_description);
description.setText(marker.getSnippet());
RatingBar rating = (RatingBar) v.findViewById(R.id.rv_info_window);
Double ratingValue = mRatingHash.get(marker);
rating.setRating(ratingValue.floatValue());
return v;
}
@Override
public View getInfoWindow(Marker marker) {
// TODO Auto-generated method stub
return null;
}
}
Вы несете ответственность за любые данные, которые хотите передать в информационное окно, но вы можете видеть здесь, что я передаю хэш оценок. Просто прототип и отнюдь не лучшее решение, но это должно заставить кого-нибудь начать.
Ответ 5
Я использую дополнительный класс для связывания некоторой информации и функций с каждым маркером. Я не думаю, что это лучший подход к нему, но это вариант. В частности, если вы хотите иметь больше, чем просто информацию, связанную с каждым маркером карты. Вот базовая структура, которую я использую для этого.
// Make an array list of for all of your things
ArrayList<Thing> things;
class Thing {
long thing_key;
String thing_string;
int thingRadius;
Double coord_long;
Double coord_lat;
Marker marker;
}
// Then to use this to start your list.
things = new ArrayList<>();
// Create the thing object and save all the data
thing = new Thing();
thing.marker = thingMarker;
thing.thing_key = thing_key;
thing.thing_string = thing_string;
thing.radius = Integer.getInteger(thingRadius.getText().toString());
// Save the thing to the thing ArrayList
things.add(thing);