【问题标题】:Using SupportMapFragment instead of MapFragment使用 SupportMapFragment 而不是 MapFragment
【发布时间】:2025-11-29 06:10:01
【问题描述】:

我正在使用 Xamarin,并且我已修改 Google Maps API 2 示例以使用 SupportMapFragment 对象而不是 MapFragment 对象。

我可以在InitMapFragment 函数方面寻求帮助吗?

代码如下:

private void InitMapFragment()
{
    _mapFragment = FragmentManager.FindFragmentByTag("map") as SupportMapFragment;
    if (_mapFragment == null)
    {
        GoogleMapOptions mapOptions = new GoogleMapOptions()
            .InvokeMapType(GoogleMap.MapTypeNormal)
            .InvokeZoomControlsEnabled(true)
            .InvokeCompassEnabled(true);

        FragmentTransaction fragTx = FragmentManager.BeginTransaction();
        _mapFragment = SupportMapFragment.NewInstance(mapOptions);
        fragTx.Add(Resource.Id.mapWithOverlay, _mapFragment, "map");
        fragTx.Commit();
    }
}

_mapFragment 曾经是 MapFragment 类型,但现在是 SupportMapFragment

此外,该活动目前继承自Activity,应该是FragmentActivity,还是其他?

这是我得到的错误:

错误 CS0039:无法将类型“Android.App.Fragment”转换为 'Android.Gms.Maps.SupportMapFragment' 通过引用转换, 装箱转换、拆箱转换、包装转换,或为空 类型转换

错误 CS1503:参数 2:无法从 'Android.Gms.Maps.SupportMapFragment' 到 'Android.App.Fragment'

我很确定我需要使用SupportFragmentManager 而不是FragmentManager,但希望得到一些帮助。

编辑

尝试使用 SupportFragmentManager 时,我收到以下错误:

错误 CS0103:名称“SupportFragmentManager”不存在于 当前上下文

提前致谢

【问题讨论】:

  • 你是对的 - 你需要使用 getSupportFragmentManager() 并使用它来获取 SupportMapFragment。
  • 你能看看我的编辑吗?
  • 我从未使用过 Xamarin,但看起来情况有些不同,例如没有 getSupportFragmentManager()。此链接可能对forums.xamarin.com/discussion/14731/… 有所帮助 - 我将从以下内容开始:Android.Support.V4.App.FragmentManager。

标签: android android-fragments xamarin supportmapfragment mapfragment


【解决方案1】:

SupportFramgentManager 是从 FragmentActivity 继承的,因此请确保该 Activity 扩展了 FragmentActivity。然后修改你的代码如下:

private void InitMapFragment()
{
    _mapFragment = SupportFragmentManager.FindFragmentByTag("map") as SupportMapFragment;
    if (_mapFragment == null)
    {
        GoogleMapOptions mapOptions = new GoogleMapOptions()
            .InvokeMapType(GoogleMap.MapTypeNormal)
            .InvokeZoomControlsEnabled(true)
            .InvokeCompassEnabled(true);

        FragmentTransaction fragTx = SupportFragmentManager.BeginTransaction();
        _mapFragment = SupportMapFragment.NewInstance(mapOptions);
        fragTx.Add(Resource.Id.mapWithOverlay, _mapFragment, "map");
        fragTx.Commit();
    }
}

【讨论】: