Карта 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);
            }
        }
    }
}