【问题标题】:SupportMapFragment.getmap() returns nullSupportMapFragment.getmap() 返回 null
【发布时间】:2013-10-13 16:43:28
【问题描述】:

我正在尝试在片段中动态加载 SupportMapFragment,这是我的 onCreateView() 方法:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            View contentView = inflater.inflate(R.layout.frag_map_layout, null);
            shopDtos=ShopListFragment.shopDtos;
            fragment =SupportMapFragment.newInstance();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.map_content, fragment);
            ft.commit();
            map = fragment.getMap();
            mapMarker = map.addMarker(new MarkerOptions().position(new LatLng(0, 0))
                    .icon(BitmapDescriptorFactory
                            .fromResource(R.drawable.maps_pin)));
        return contentView;
    }

不幸的是,我得到的 GoogleMap 地图是null。 关于如何动态创建地图片段有什么建议吗?

【问题讨论】:

  • 查看日志,很可能你没有在 play services 控制台中启用 google maps API。
  • no.. 当我们将 frgment 直接添加到 xml 文件时它会加载...但是....问题是... frgment.getmap() 返回 null.. 所以我不能向地图添加标记

标签: android google-maps-android-api-2 supportmapfragment


【解决方案1】:

map 需要一些时间来加载,所以你需要在 handler 中运行你的代码 -->

Handler handler = new Handler();
handler.postDelayed(new Runnable() 

   @Override
   public void run() {
       GoogleMap googleMap = SupportMapFragment.newInstance(new GoogleMapOptions().zOrderOnTop(true)).getMap();
       FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.map_content, fragment);
        ft.commit();
       if(googleMap != null) {
          googleMap.addMarker(new MarkerOptions().position(result)).setVisible(true);

          // Move the camera instantly to location with a zoom of 15.
          googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(result, 15));

          // Zoom in, animating the camera.
          googleMap.animateCamera(CameraUpdateFactory.zoomTo(14), 2000, null);

          googleMap.getUiSettings().setZoomControlsEnabled(false);
          googleMap.getUiSettings().setCompassEnabled(false);
          googleMap.getUiSettings().setMyLocationButtonEnabled(false);

          handler.removeCallbacksAndMessages(null);
       }

       else {
            handler.postDelayed(this, 500);
       }
 }, 500);

【讨论】:

  • 地图正在加载,但同样的问题是无法在地图上添加标记
  • 为什么这里需要一个Handler?为什么不在 onActivityCreated() 中做这段代码?
  • 这里是一个更强大的解决方案的链接:stackoverflow.com/a/19109093/1429640
  • @brainmurphy1 感谢分享解决方案,我认为您的解决方案简单明了。
【解决方案2】:

只需尝试使用以下代码。它对我有用。

public class MapFragment extends SupportMapFragment {

    GoogleMap mapView;
    private Context context;

    @Override
    public void onCreate(Bundle arg0) {
        super.onCreate(arg0);
    }

    @Override
    public View onCreateView(LayoutInflater mInflater, ViewGroup arg1,
        Bundle arg2) {
        View view = super.onCreateView(mInflater, arg1, arg2);

        return view;
    }

    @Override
    public void onInflate(Activity arg0, AttributeSet arg1, Bundle arg2) {
        super.onInflate(arg0, arg1, arg2);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        context = getActivity();
        mapView = getMap();
    }
}

【讨论】:

    【解决方案3】:

    围绕同一个主题有一堆重复的问题...我似乎无法弄清楚如何将其标记为重复然后在其上给出一个答案...

    这是另一个链接:Android SupportMapFragment.getMap() returns null

    那里也发布了潜在的答案:

    检查您的布局 xml 文件。我注意到我没有引用: android:name="com.google.android.gms.maps.SupportMapFragment" 但是 而是:android:name="com.google.android.gms.maps.MapFragment"

    名称应为: android:name="com.google.android.gms.maps.SupportMapFragment"

    【讨论】:

    • 这对我来说才是真正的问题!非常感谢!
    【解决方案4】:

    我曾经在尚未安装/更新 Google Play 服务的新购买设备中发生这种情况。提到其他笔记当然也可以考虑这个。

    【讨论】:

      【解决方案5】:

      此问题的最新解决方案是改用getMapAsync (OnMapReadyCallback callback)

      【讨论】:

        【解决方案6】:
        getChildFragmentManager().findFragmentById(R.id.map)
        

        在 Fragment 中尝试 getChildFragmentManager()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          相关资源
          最近更新 更多