android - Viewpager 中的 map v2 SupportMapFragment

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

背景

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

问题

如何加载带有标记的新 map v2 SupportMapFragment进入 ViewPager使用 FragmentPagerAdapter .

我的尝试

所以我天真地认为可以通过将 SupportMapFragment 扩展到一个执行以下操作的新类来创建一个优雅的解决方案:

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

我的想法是,我的扩展可以高度可重用,并抽象出与一个地方相关的任何 map ,并允许我的 Activity 通过 newInstance(myGoogleMapOptions, myMarkers) 创建新的 MapFragment | .

好的,问题来了。第 1 部分似乎工作正常,但在调试期间我无法调用覆盖的 GetMap() 方法。事实上,我已经尝试覆盖 fragment 具有的大多数常用方法,但没有一个被调用。 SupportMapFragmemt 是不是有什么奇怪的地方,我试图找到它的源代码来检查自己无济于事。

更新

我意识到为什么我没有调用覆盖的方法。这是因为我要返回标准 SupportMapFragment而不是 MyMapFragment .也就是说,我不能从静态方法调用 super,也不能毫无异常(exception)地从基类强制转换为派生类。

编辑 这是类

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

    }

}

最佳答案

就这样试过了,成功了。

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

关于android - Viewpager 中的 map v2 SupportMapFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735124/

相关文章:

java - android - 动态添加按钮到自定义对话框

Android:finishAffinity() 与 finishAndRemoveTask()

Android 设计支持库 : TabLayout tabs text in single line

android - Xamarin Studio 2 - 最新的稳定更新 - 执行任务 Aapt : The source sequence is empty 时出错

Android Studio 不呈现 SignInButton <item> 标记需要 'android:color' 属性

java - 连接良好时上传图片,Android(后台进程)

android - 处理具有负页边距的 ViewPager 中的点击事件

android - 循环 FragmentPagerAdapter

java - 从 html (JSOUP) 获取图标

java - 如何在 Android 中加速从 .txt 解析数据并写入 SQLite?