在MapFragment中调用onStart()内的getMap()会产生nullpointerexception

时间:2013-02-24 08:38:37

标签: android google-maps nullpointerexception mapfragment

我正在尝试在操作栏标签中实施Maps v2。 map选项卡是从MapFragment继承的片段。 单击地图选项卡后,应用程序强制关闭。它在onStart方法中给出了空指针异常,其中调用了getMap()。 这是代码。请告诉我错在哪里。

    public class MapActivity extends MapFragment implements LocationListener  {
int mNum;
GoogleMap googleMap;  


public static MapActivity newInstance() {
    MapActivity f = new MapActivity();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    //args.putInt("num", num);
    //f.setArguments(args);

    return f;
}

/**
 * When creating, retrieve this instance's number from its arguments.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.maplayout, container, false);

    return v;
}


/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
public void onStart(){
    super.onStart();

    googleMap=getMap();

    // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);               


             getActivity();
            // Getting LocationManager object from System Service LOCATION_SERVICE
            LocationManager locationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);

            // Creating a criteria object to retrieve provider
            Criteria criteria = new Criteria();

            // Getting the name of the best provider
            String provider = locationManager.getBestProvider(criteria, true);

            // Getting Current Location
            Location location = locationManager.getLastKnownLocation(provider);

            if(location!=null){
                    onLocationChanged(location);
            }

            locationManager.requestLocationUpdates(provider, 20000, 0, this);


         // Setting a click event handler for the map
            googleMap.setOnMapClickListener(new OnMapClickListener() {

                @Override
                public void onMapClick(LatLng latLng) {

                    // Creating a marker
                    MarkerOptions markerOptions = new MarkerOptions();

                    // Setting the position for the marker
                    markerOptions.position(latLng);

                    // Setting the title for the marker.
                    // This will be displayed on taping the marker
                    markerOptions.title(latLng.latitude + " : " + latLng.longitude);

                    // Clears the previously touched position
                    //googleMap.clear();

                    // Animating to the touched position
                    googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

                    // Placing a marker on the touched position
                    googleMap.addMarker(markerOptions);
                }
            });


        }


        @Override
        public void onLocationChanged(Location location) {

            TextView tvLocation = (TextView) getActivity().findViewById(R.id.tv_location);

            // Getting latitude of the current location
            double latitude = location.getLatitude();

            // Getting longitude of the current location
            double longitude = location.getLongitude();     

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);

            // Showing the current location in Google Map
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

            // Zoom in the Google Map
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));

            // Setting latitude and longitude in the TextView tv_location
            tvLocation.setText("Latitude:" +  latitude  + ", Longitude:"+ longitude );      

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub      
        }       

}

编辑:我认为这段代码不应该用onStart方法编写,因为那时候不会显示地图。如何知道地图已被加载,以获取其对象?

1 个答案:

答案 0 :(得分:1)

在OnStart中获取空地图意味着Google Services API尚未启动。

这通常是由于缺少权限,或Google API密钥无效,或主机设备未激活Google Play服务。

您可以通过发布AndroidManifest以及maplayout.xml来获取更多信息

在启动地图活动之前,您应该注意以下值:

GooglePlayServicesUtil.isGooglePlayServicesAvailable(anyActivity)

将返回有关Google Play服务状态的指示