使用片段的谷歌地图

Posted

技术标签:

【中文标题】使用片段的谷歌地图【英文标题】:Google Maps Using Fragments 【发布时间】:2018-12-06 19:32:03 【问题描述】:

我在片段中使用谷歌地图(导航抽屉)。当应用程序启动时,第一个片段与谷歌地图一起显示。我已经在 onViewCreated 方法中初始化了谷歌地图。第一次它显示谷歌地图完全符合我的位置,但是当我选择另一个片段并返回到这个片段时,它会抛出空指针异常。

代码中这里抛出异常:

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));

方法:

private void moveCamera(LatLng latLng, float zoom, String title) 
    Log.d(TAG, "moveCamera:  moving the camera to:   " + latLng.latitude + " lon " + latLng.longitude);

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));

OnViewCreated 方法:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) 

    getLocation();

    mapView =  view.findViewById(R.id.map);
    mapView.onCreate(savedInstanceState);
    mapView.onResume();
    mapView.getMapAsync(this);

OnMapReady 方法:

@Override
public void onMapReady(GoogleMap googleMap) 
    mMap = googleMap;
    mMap.setMyLocationEnabled(true);
    init();


private void getLocation() 
    Log.d(TAG, "getDeviceLocation: getting the current device's location");
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getContext());

    try 
        if (mLocationGranted) 

            Task location = mFusedLocationProviderClient.getLastLocation();
            location.addOnCompleteListener(new OnCompleteListener() 
                @Override
                public void onComplete(@NonNull Task task) 

                    if (task.isSuccessful()) 
                        Log.d(TAG, "device location found");
                        currentLocation = (Location) task.getResult();
                        moveCamera(new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()), DEFAULT_ZOOM, "My Location");
                     else 
                        Log.d(TAG, "onComplete:  current location is null");
                        Toast.makeText(getContext(), "unable to get current location", Toast.LENGTH_SHORT).show();
                        getLocationPermissions();

                    
                
            );
        

     catch (SecurityException e) 
        Log.e(TAG, "SecurityException :  " + e.getMessage());
    



错误

Exception: java.lang.NullPointerException: Attempt to invoke virtual method 
void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.map.CameraUpdate) 
on a null object reference`

【问题讨论】:

你在哪里调用你的方法 moveCamera()? getLocation 方法内部 我已经更新了代码。请看一下 【参考方案1】:

您收到 NullPointerException 是因为当您尝试移动其相机时您的地图尚未准备好。

您可以尝试执行以下操作

@Override
public void onMapReady(GoogleMap googleMap) 

  mMap = googleMap;
  mMap.setMyLocationEnabled(true);
  init();

  getLocation();


通过这样做,您的代码将尝试在地图可用时移动地图相机或更改您的代码逻辑并从getLocation() 方法中删除您的moveCamere(),例如将其放入onResume()

【讨论】:

以上是关于使用片段的谷歌地图的主要内容,如果未能解决你的问题,请参考以下文章

导航抽屉中的谷歌地图 - 空指针异常,哪个是正确的片段?

另一个片段内的谷歌地图 - 像 onLocationChanged 这样的功能不起作用

如何在Android的谷歌地图片段中更改默认的蓝色圆形位置图标?

谷歌地图片段显示空地图

谷歌地图不显示在片段中

使用文本地址的谷歌地图街景地图