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

时间:2017-04-07 14:48:11

标签: android google-maps android-studio nullpointerexception supportmapfragment

我有一个FragmentActivity我试图加载谷歌地图。它实现了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对象为null,并且当调用任何与googleMap相关的方法(例如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"/>

4 个答案:

答案 0 :(得分:2)

提示为getMapAsync (asynchronous)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

好。我得到了解决方案。我将与googleMap相关的方法(即setOnCameraChangeListener)移动到onMapReady,之前在onCreate中调用了onMapReady。 onCreate中的googleMap对象为null,导致应用程序崩溃。

答案 3 :(得分:-1)

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

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

这对我有用