如何在不破坏onMapReady活动的情况下修复地图对象中的nullPointerException

时间:2019-05-21 16:18:35

标签: java android nullpointerexception

我的应用程序应在第一个片段中显示地图。该应用程序由导航抽屉组织。显示的地图没有问题,但没有显示我提供的默认缩放比例和位置。

创建应用程序时遇到的第一个错误是NullPointerException。我知道如何修复它,所以我说我的地图片段(mapFragment)不是null。该应用程序现已开始运行,但是我在方法onMapReady中编写的代码以及用于获取当前位置并将相机移动到该特定位置的按钮均无法显示/无法正常工作。

我也尝试过更改地图的代码,但我总是在同一地点结束。如果我不写map!=null,我会得到NullPointerException。如果我确实编写了该应用,则该应用无法正确放大到特定位置。

Mainactivity中:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  SupportMapFragment mapFragment = (SupportMapFragment)
  getSupportFragmentManager()
          .findFragmentById(R.id.mapFragment);
  if(mapFragment != null) {
      mapFragment.getMapAsync(this);
  }
}

这是我必须防止使用NullPointerException(mapFragment)


在这里,我设置了默认的位置和缩放比例,该比例并没有应用到地图上(使用mapFragment!= null时):

@Override
public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;

    if(ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) == 
       PackageManager.PERMISSION_GRANTED)
    {
        buildGoogleApiClient();

        mMap.setMyLocationEnabled(true);
    }

    LatLng Luxembourg = new LatLng(49.611622, 6.131935);
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom
    (Luxembourg, 14));
}

这是检索用户当前位置的方法(在具有mapFragment!= null的情况下也无法使用):

@Override
public void onLocationChanged(Location location) {
    lastLocation = location;

    if(currentUserLocationMarker != null)
    {
        currentUserLocationMarker.remove();
    }

    LatLng latLng = new LatLng(location.getLatitude(), 
    location.getLongitude());

    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latLng);
    markerOptions.title("current user location");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker
    (BitmapDescriptorFactory.HUE_RED));

    currentUserLocationMarker = mMap.addMarker(markerOptions);

    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.animateCamera(CameraUpdateFactory.zoomBy(14));

    if(googleApiClient != null)
    {
        LocationServices.FusedLocationApi.removeLocationUpdates
        (googleApiClient, this);
    }
}

这是mapFragment本身:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/mapFragment"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:context="com.example.mapwithmarker.MapsMarkerActivity" />
</FrameLayout>

我希望地图具有我提供的默认位置和缩放比例,以及将地图移动到用户当前位置的按钮。

1 个答案:

答案 0 :(得分:0)

您可以考虑为SupportMapFragment编写一个构造函数,并在进行片段事务之前首先对其进行初始化。因此,您将不会得到NullPointerException

我建议类似以下内容。

// Declare this in your class as a public variable.
public SupportMapFragment mapFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mapFragment = new SupportMapFragment();

  // I suppose this is doing something that requires the context. 
  // Omit this for now
  // mapFragment.getMapAsync(this);

  // Do the fragment transaction here
}

然后在onResume的{​​{1}}方法中执行以下操作。

SupportMapFragment

这只是示例代码。您可以考虑将参数传递给@Override public void onResume() { super.onResume(); getMapAsync(getActivity()); } 的构造函数,该构造函数将初始化必要的变量。我希望你能明白。