Google Play服务 - SupportMapFragment.getMap()始终返回null

God*_*hen 17 android android-maps google-play-services

可能重复:
使用SupportMapFragment时,如何知道地图已准备好使用?

我目前正在测试新的Maps API V2,但我真的无法让它正常工作.

我的问题是getMap()总是返回null.

我已经在3个不同的点测试了这个电话:

  1. 的onCreate()
  2. 的onResume()
  3. 在地图已在屏幕上可见的几秒后调用的处理程序中

这是代码:

public class MapActivity extends FragmentActivity {

private SupportMapFragment mMapFragment;

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

@Override
protected void onResume() {
    super.onResume();
    setupMap();
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            setupMap();
        }
    }, 5000);
}

private void setupMap() {
    if (getSupportFragmentManager().findFragmentById(R.id.fragment) == null) {
    mMapFragment = CustomMapFragment.newInstance();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.map_wrapper, mMapFragment).commit();
    }
    GoogleMap map = mMapFragment.getMap();
    if (map != null) {
        mMapFragment.getMap().getUiSettings().setZoomControlsEnabled(true);
        mMapFragment.getMap().getUiSettings().setZoomGesturesEnabled(true);
        mMapFragment.getMap().setMyLocationEnabled(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

God*_*hen 47

正如CommonsWare在链接问题中所述,问题仅在以SupportMapFragment编程方式而非<fragment>XML标记创建时发生.

如果以编程方式创建,则地图将在onActivityCreated()呼叫中可用.所以我的解决方法如下:

mMapFragment = new SupportMapFragment() {
            @Override
            public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                GoogleMap map = mMapFragment.getMap();
                if (map != null) {
                    //Your initialization code goes here
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)

  • 不应该创建非静态内部片段,因为编译器将自动创建构造函数以将片段外部类作为参数提供.然后在片段重新创建时,您将获得"InstantiationException",因为片段没有默认的空构造函数. (7认同)