onMapReady 未被调用:Google FrgmentActivity 中的地图:Android Studio

onMapReady not being called: Google Map in FrgmentActivity: Android Studio

我有一个 FragmentActivity,我试图在其中加载 google 地图。它实现了 OnMapReadyCallBack,当我尝试膨胀地图时,我得到了 mapFragment 对象,但是应用程序在调用 getMapAsync 后崩溃了。下面是我的代码:

public class MapActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap googleMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_map);

    initializeMap();
    }

    private void initializeMap() {
        if (googleMap == null) {
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
            if(mapFragment!=null){
                mapFragment.getMapAsync(MapActivity.this);
            }

            // check if map is created successfully or not
            if (null== googleMap) {
                Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onMapReady(GoogleMap map) {
        googleMap = map;
        googleMap.setMyLocationEnabled(true);
    }
}

我尝试调试,我注意到我正在获取 mapFragment 对象,但它从未到达 onMapReady 方法,这使得我的 googleMap 对象为空,并且当任何与 google正在调用地图(例如 setOnCameraChangeListener)。我已经完成了 documentation page 但它似乎在我的项目中不起作用。

我的项目中是否缺少某些东西?我应该如何克服这个错误并阻止应用程序崩溃。

TIA

编辑 1:

下面是我在 xml 文件

中的地图片段
<fragment
  android:id="@+id/map"
  class="com.google.android.gms.maps.SupportMapFragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MapsActivity"
  android:name="com.google.android.gms.maps.SupportMapFragment"/>

mapFragment.getMapAsync(MapActivity.this); 表示地图将异步加载,如果加载完成,将回调到 onMapReady()

以下代码可能无法运行,因为地图尚未完成加载。您应该在 onMapReady() 方法内设置地图,而不是在 initializeMap().

if (null == googleMap) { // googleMap will still be null here
    Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show();
}

提示是getMapAsync(asynchronous).

onMapReady 不会立即被调用,这意味着 googleMap 在方法被调用之前不会被设置。

编辑:确保在设置映射值之前没有对 googleMap 进行方法调用,即在 运行 方法之前添加检查它是否为空。还要将 @Nullable 注释添加到 private GoogleMap googleMap;,这将有助于开发,因为 Android 工作室会在您缺少空检查时提醒您。

嗯。我得到了解决方案。我将与 googleMap 有关的方法(即 setOnCameraChangeListener)移至 onMapReady,该方法之前在 onCreate 中被调用。 onCreate 中的 googleMap 对象为空,导致应用程序崩溃。

@qwertz 你必须在你的 oncreate 中设置地图。当 getMapAsync 完成后,mapreadycallback 将调用 onMapReady

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

这对我有用