NullPointerException в методе getOverlays () - PullRequest
0 голосов
/ 02 ноября 2011

Я вижу проблему в приведенном ниже коде, когда каждый раз, когда я вызываю метод getOverlays () MapView (соответственно называется mapView), я получаю исключение NullPointerException.Это непротиворечивое событие, даже когда я передаю результат вызова getOverlays () в переменную, а затем выполняю для него «add (itemisedOverlay)». Я использовал код учебника Hello, MapView в качестве основы иссылка на этот код с небольшой модификацией, позволяющей использовать местоположение GPS (исходя из моего опыта работы с библиотеками OSMdroid, использованными в альтернативном прототипе этого приложения). Цель здесь - показать последнее известное местоположение GPSчерез API карт с небольшим значком в этом месте.

Кроме того, если я удаляю нижеприведенное объявление try / catch, это становится ошибкой приложения.

Любая помощь по устранению исключения NullPointerException будеточень ценится!

TestMapDisplayGoogleActivity:

package com.test.google;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class TestMapDisplayGoogleActivity extends MapActivity {

    Drawable drawable;
    TestItemizedOverlay itemisedOverlay;
    private GeoPoint center;

    LocationListener TestListener = new LocationListener() 
    {
        public void onLocationChanged(Location location)
        {
            center = new GeoPoint((int) location.getLatitude(), (int)       location.getLongitude());;
    }

    public void onProviderDisabled(String provider) 
    {
        // required for interface, not used
    }

    public void onProviderEnabled(String provider) 
    {
        // required for interface, not used
    }

    public void onStatusChanged(String provider, int status, Bundle extras) 
    {
        // required for interface, not used
    }
};

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

    try
    {
        //Create the mapview & set basic settings
        MapView mapView = (MapView) findViewById(R.id.mapview);

        //Retrieve location manager and last know GPS location
        LocationManager locMan = (LocationManager) this.getSystemService(LOCATION_SERVICE);


        locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2500, 100, TestListener);
        Criteria testCrit = new Criteria();
        testCrit.setAccuracy(Criteria.ACCURACY_COARSE);
        Location location = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        center = new GeoPoint((int) location.getLatitude(), (int) location.getLongitude());



        //Instantiate the overlays and create the item to be added to the overlay
        drawable = this.getResources().getDrawable(R.drawable.ic_launcher);
        itemisedOverlay = new TestItemizedOverlay(drawable);
        OverlayItem testItem = new OverlayItem(center, "Test", "Hey there!");

        //Add testItem to the overlay
        itemisedOverlay.addOverlayItem(testItem);
        mapView.getOverlays().add(itemisedOverlay);

        mapView.getController().setCenter(center);

        mapView.getController().setZoom(20);
        mapView.setSatellite(true);

        setContentView(R.layout.main);
    }
    catch (NullPointerException e)
    {
        setContentView(R.layout.error_display);
        e.printStackTrace();
    }
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
    }
}

Просмотр карты в main.xml:

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/mainlayout"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent" >

<com.google.android.maps.MapView
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="[Location of API Key in real project]"
/>
 </RelativeLayout>

Сообщение об ошибке:

11-02 03:53:00.294: E/AndroidRuntime(2589): FATAL EXCEPTION: main
11-02 03:53:00.294: E/AndroidRuntime(2589): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.google/com.test.google.TestMapDisplayGoogleActivity}: java.lang.NullPointerException
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.os.Looper.loop(Looper.java:123)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at java.lang.reflect.Method.invokeNative(Native Method)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at java.lang.reflect.Method.invoke(Method.java:521)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at dalvik.system.NativeStart.main(Native Method)
11-02 03:53:00.294: E/AndroidRuntime(2589): Caused by: java.lang.NullPointerException
11-02 03:53:00.294: E/AndroidRuntime(2589):     at com.test.google.TestMapDisplayGoogleActivity.onCreate(TestMapDisplayGoogleActivity.java:74)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-02 03:53:00.294: E/AndroidRuntime(2589):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-02 03:53:00.294: E/AndroidRuntime(2589):     ... 11 more

1 Ответ

2 голосов
/ 02 ноября 2011
setContentView(R.layout.main);

Эта строка должна быть первой в OnCreate (), поскольку она содержит вид карты до тех пор, пока вы не установите вид

MapView mapView = (MapView) findViewById(R.id.mapview); вернет NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...