首页 文章

当尝试在外面的 Map 上绘制时,GoogleMap会给我null

提问于
浏览
0

如何正确保护GoogleMap免于空?

它目前在 drawOnMap() 方法中表示mMap null,但在将其添加到 onMapReady() 方法时有效 .

我想知道因为如果我在 onMapReady() 内要求 drawOnMap() ,在我从我的意图中获取值之前可能会启动 Map 是不是真的?

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startLatLng,10));

public class DetailActivity extends AppCompatActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private String locationA;
private String locationB;
private ArrayList<LatLng> latLngList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    // Check if Google Maps have been activated, else starting it again.
    if (mMap == null) {
        SupportMapFragment smf = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.map);
        smf.getMapAsync(this);
    }

    // Settings up the views
    TextView mDistance = (TextView) findViewById(R.id.distanceDetail);
    TextView mDuration = (TextView) findViewById(R.id.durationDetail);
    TextView mLocationA = (TextView) findViewById(R.id.locationA);
    TextView mLocationB = (TextView) findViewById(R.id.locationB);


    // Getting the values
    Intent i = getIntent();
    locationA = i.getStringExtra("locA");
    locationB = i.getStringExtra("locB");
    String distance = i.getStringExtra("distance");
    String duration = i.getStringExtra("duration");


    // initiate the values.
    mDistance.setText(distance);
    mDuration.setText(duration);
    mLocationA.setText(locationA);
    mLocationB.setText(locationB);


    drawOnMap();
}





public void drawOnMap(){

    latLngList = getIntent().getParcelableArrayListExtra("points");

    // Används för att rita ut marksen på kartan sedan, start och stop.
    // Get the first and last postion to write out the marks on map
    LatLng startLatLng = latLngList.get(0);
    LatLng endLatLng = latLngList.get(latLngList.size() - 1);

    // Zooms into the start position;
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startLatLng, 10));

    // Adding mark to start location
    mMap.addMarker(new MarkerOptions()
            .position(startLatLng)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
            .title(locationA));

    // Adding mark to end location
    mMap.addMarker(new MarkerOptions()
            .position(endLatLng)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
            .title(locationB));


    if (latLngList.size() > 0) {
        // Draw the route on map
        mMap.addPolyline(new PolylineOptions()
                .addAll(latLngList)
                .color(Color.argb(255, 55, 160, 255))
                .width(20));
    }
}



@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    UiSettings mapSettings = mMap.getUiSettings();
    mapSettings.setZoomControlsEnabled(true);
}

Catlog

java.lang.NullPointerException:尝试在android.app上的空对象引用上调用虚拟方法'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' .ActivityThread.performLaunchActivity(ActivityThread.java:2416)位于android.app.A活动中的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)android.app.ActivityThread $ H.handleMessage上的android.app.ActivityThread.-wrap11(ActivityThread.java) (ActivityThread.java:1344)android.app.Handler.dispatchMessage(Handler.java:102)位于android.app.ActivityThread.main的android.os.Looper.loop(Looper.java:148)(ActivityThread.java: 5417)位于com.android.internal.os.ZygoteInit.main的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)的java.lang.reflect.Method.invoke(Native Method)( ZygoteInit.java:616)引起:java.lang.NullPointerException:尝试调用虚拟方法'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.Camera更新)'com.example.rasmusjosefsson.rjcar.DetailActivity.drawOnMap(DetailActivity.java:113)上的null对象引用,位于android.app的com.example.rasmusjosefsson.rjcar.DetailActivity.onCreate(DetailActivity.java:96) .Activity.performCreate(Activity.java:6237)位于android.app.A.运行中的android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1107)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369),android.app.ActivityThread.handleLaunchActivity( ActivityThread.java:2476)在android.app.Handler.dispatchMessage的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344)的android.app.ActivityThread.-wrap11(ActivityThread.java)处(Handler.java: 102)在android.app.Looper.loop(Looper.java:148)的android.app.ActivityThread.main(ActivityThread.java:5417),位于com.android的java.lang.reflect.Method.invoke(Native Method) .internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2 回答

  • 0

    映射准备好后调用drawOnMap方法 .

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        UiSettings mapSettings = mMap.getUiSettings();
        mapSettings.setZoomControlsEnabled(true);
    
        drawOnMap();
    }
    
  • 0

    您将在 onMapReady() 方法中获取谷歌 Map 对象,这就是为什么从这里调用 drawOnMap()

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    
       // Call drawOnMap() from here
    }
    

相关问题