在Viewpager中映射v2 SupportMapFragment

时间:2012-12-06 00:40:34

标签: android android-fragments android-viewpager android-maps

背景

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

问题

如何将带有标记SupportMapFragment的新地图v2加载到使用ViewPager的{​​{1}}。

我的尝试

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

  1. 添加一个占用FragmentPagerAdapterGoogleMapOptions的新构造函数。这有效地调用刚刚接受List<MarkerOptions>的现有构造函数,然后将我的标记列表存储在新类的私有属性中。
  2. 覆盖GoogleMapsOptions - 检查它是否为空,如果它没有将标记添加到我们之前加载到地图上的地图上,最后将其返回。
  3. 我的想法是,我的扩展程序可以高度重用,并抽象出与一个地方相关的任何地图,并允许我的活动通过GetMap()创建新的MapFragment。

    好的问题。第1部分似乎工作正常但是在调试期间我无法调用重写的GetMap()方法。事实上,我已经尝试重写碎片拥有的大多数常用方法,但没有一个被调用。是否有一些奇怪的事情发生在SupportMapFragmemt上,我试图找到它的来源,但无法自行检查。

    更新

    我意识到为什么我没有得到被覆盖的方法。这是因为我正在返回标准newInstance(myGoogleMapOptions, myMarkers)而不是SupportMapFragment。也就是说我不能从静态方法调用super,并且我无法毫无例外地从基类转换为派生类。

    修改 这是班级

    MyMapFragment

1 个答案:

答案 0 :(得分: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);
            }
        }
    }
}