Карта v2 ПоддержкаMapFragment внутри Viewpager
Фон
Я успел добавить новую карту api v2.0 в ViewPager, и карта загрузилась нормально. Я использую FragmentViewPager. Однако я сталкиваюсь с проблемами при попытке добавить маркеры, поскольку я не могу получить фрагмент по тегу, поскольку ViewPager, который я использую, из библиотеки совместимости и определен в XML, и это "скрывает" тег от меня.
Вопрос
Как загрузить новый Map v2 с маркерами SupportMapFragment
в ViewPager
, который использует FragmentPagerAdapter
.
Моя попытка
Таким образом, в моей жизни я думал, что может создать элегантное решение, расширив SupportMapFragment до нового класса, который делает следующее:
- Добавить новый конструктор, который принимает
GoogleMapOptions
и List<MarkerOptions>
. Это эффективно вызывает существующий конструктор, который просто принимает GoogleMapsOptions
, а затем сохраняет мой список маркеров внутри частного свойства нового класса.
- Переопределить
GetMap()
- проверить, является ли оно нулевым, и если он не добавляет маркеры на карту, которую мы загрузили ранее на карту, и, наконец, вернем ее.
Мои мысли состояли в том, что мое расширение может быть очень многоразовым и абстрагировать любую карту, связанную с одним местом, и позволяет моим действиям создавать новый MapFragment на newInstance(myGoogleMapOptions, myMarkers)
.
Хорошо, так что проблема. Часть 1, кажется, работает нормально, однако во время отладки я не могу получить переопределенный метод GetMap(). На самом деле я попытался переопределить большинство обычных методов, которые имеют фрагменты, и никто из них не вызван. Что-то странное происходит с SupportMapFragmemt, я пытался найти источник для этого безрезультатно, чтобы проверить себя.
Обновление
Я понял, почему я не вызывал переопределенные методы. Это было потому, что я возвращал стандарт SupportMapFragment
, а не MyMapFragment
. Тем не менее я не могу назвать super из статического метода, и я не могу отличить его от базового класса до производного класса без исключения.
Edit
Вот класс
public class MyMapFragment extends SupportMapFragment {
private static List<MarkerOptions> mMarkers;
public static SupportMapFragment newInstance(GoogleMapOptions options, List<MarkerOptions> markers)
{
SupportMapFragment fragment = newInstance(options);
mMarkers = markers;
return fragment;
}
//have tried Overriding several methods including getMap()...
@Override
public void onResume ()
{
GoogleMap mMap = super.getMap();
//add the markers
if(mMap != null)
{
for(MarkerOptions marker : mMarkers)
{
mMap.addMarker(marker);
}
}
}
}
Ответы
Ответ 1
Просто пробовал вот так, и он работает.
public class MyMapFragment extends SupportMapFragment {
private List<MarkerOptions> mMarkers;
public static MyMapFragment create(GoogleMapOptions options, ArrayList<MarkerOptions> markers) {
MyMapFragment fragment = new MyMapFragment();
Bundle args = new Bundle();
args.putParcelable("MapOptions", options); //obtained by decompiling google-play-services.jar
args.putParcelableArrayList("markers", markers);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Hacky and ugly but it works
ArrayList<Parcelable> list = getArguments().getParcelableArrayList("markers");
mMarkers = new ArrayList<MarkerOptions>(list.size());
for (Parcelable parcelable : list) {
mMarkers.add((MarkerOptions) parcelable);
}
}
@Override
public void onResume() {
super.onResume();
GoogleMap mMap = super.getMap();
//add the markers
if (mMap != null) {
for (MarkerOptions marker : mMarkers) {
mMap.addMarker(marker);
}
}
}
}