14

背景

我已经成功地将新地图 api v2.0 添加到 ViewPager 并且地图加载正常。我正在使用 FragmentViewPager。但是,当我尝试添加标记时遇到了麻烦,因为我无法按标签获取片段,因为我使用的 ViewPager 来自兼容性库并在 XML 中定义,这对我“隐藏”了标签。

问题

如何将带有标记的新 Map v2 加载SupportMapFragmentViewPager使用FragmentPagerAdapter.

我的尝试

因此,在我的想法中,我认为可以通过将 SupportMapFragment 扩展为执行以下操作的新类来创建一个优雅的解决方案:

  1. GoogleMapOptions添加一个采用and的新构造函数List<MarkerOptions>。这有效地调用了现有的构造函数,该构造函数GoogleMapsOptions将我的标记列表存储在新类的私有属性中。
  2. 覆盖GetMap()- 检查它是否为空,如果不是,将我们之前加载到地图上的标记添加到地图上,最后返回它。

我的想法是,我的扩展可以高度重用,并抽象出与一个地方相关的任何地图,并允许我的活动通过newInstance(myGoogleMapOptions, myMarkers).

好的,所以问题。第 1 部分似乎工作正常,但是在调试期间我无法调用重写的 GetMap() 方法。事实上,我已经尝试过覆盖 Fragment 拥有的大多数常用方法,但它们都没有被调用。SupportMapFragmemt 是否发生了一些奇怪的事情,我试图找到它的来源,但无济于事。

更新

我意识到为什么我没有调用我的重写方法。这是因为我返回的是标准SupportMapFragment而不是MyMapFragment. 也就是说,我不能从静态方法调用 super,也不能毫无例外地从基类转换为派生类。

编辑 这里是类

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

    }

}
4

1 回答 1

24

就像这样尝试过,它可以工作。

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);
            }
        }
    }
}
于 2012-12-09T00:29:40.223 回答