片段中的空指针异常,使用谷歌地图

时间:2015-07-19 03:43:49

标签: android google-maps android-fragments google-maps-android-api-2

我在片段中获取Android谷歌地图时收到空指针异常。错误发生在findFragmentById.I尝试使用的行 if(mMap!= null)并且它表示地图仍为空。我该怎么做才能解决这个问题?

在MapActivity.java中,

query.beginsWith("key", word, false);

}

在map_view.xml中,

//Relevant imports
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
enter code here
public class MapView extends Fragment {

GoogleMap mMap;
LatLng mLocation = new LatLng(1.379348, 103.849876);

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.map_view, container, false);

        mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 

        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        //Zoom
        mMap.getUiSettings().setZoomControlsEnabled(true);

        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLocation, 17));
        Marker mMarker = mMap.addMarker(new MarkerOptions()
        .position(mLocation)
        .title("School")
        .snippet("NTU")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));

        mMap.setOnMarkerClickListener(new OnMarkerClickListener()
        {
            public boolean onMarkerClick(Marker marker){
                Toast.makeText(getActivity().getApplicationContext(), "Welcome to " + marker.getTitle(), Toast.LENGTH_LONG);

                return false;
            }
        });

        mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener(){

            @Override
            public void onInfoWindowClick(Marker arg0) {
                // TODO Auto-generated method stub

            }
        });

        return rootView;
    }

2 个答案:

答案 0 :(得分:2)

为了将一个SupportMapFragment嵌套在Fragment中,您需要使用(function() { "use strict"; var app = angular.module("app", []); })(); //<<---Here 而不是getChildFragmentManager()

所以,你会改变这个:

getFragmentManager()

为此,并将所有引用 mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 的代码移至mMap

onResume()

如果你走这条路线,你还需要修复你的布局xml以使用SupportMapFragment:

 mMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); 

但是,如果您不需要,最好不要嵌套片段,因为它可以导致other problems

更好的方法是让Fragment扩展SupportMapFragment。这样做,你甚至不需要布局xml文件。

示例:

<fragment
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

答案 1 :(得分:0)

请你试试这个吗?

 <com.google.android.gms.maps.MapView
      android:id="@+id/mapView"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

活动片段

private GoogleMap mMap;
private MapView mapView;
onCreate()上的

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
     View rootView = inflater.inflate(R.layout.fragment_map,container, false)
     initializaMap(rootView, savedInstanceState);
   return rootView;
}
onResume()

上的

@Override
    public void onResume() {
       if(mapView!=null){
            mapView.onResume();
        }
        super.onResume();

    }
onDestroy()

上的

    @Override
    public void onDestroy() {

        if(mapView!=null){
            mapView.onDestroy();
        }

        super.onDestroy();
    }

on onLowMemory()

@Override
    public void onLowMemory() {

        if(mapView!=null){
            mapView.onLowMemory();
        }

        super.onLowMemory();
    }

添加新方法:

private void initializaMap(View rootView, Bundle savedInstanceState){
        MapsInitializer.initialize(getActivity());
        switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity())) {
            case ConnectionResult.SUCCESS:
                mapView = (MapView) rootView.findViewById(R.id.mapView);
                mapView.onCreate(savedInstanceState);

                if (mapView != null) {
                    mMap = mapView.getMap();
                    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                    UiSettings mUiSettings = mMap.getUiSettings();
                    mMap.setMyLocationEnabled(true);
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(zoomLevel));
                    mUiSettings.setCompassEnabled(true);
                    mUiSettings.setMyLocationButtonEnabled(false);
                    mMap.setOnMarkerClickListener(this);
                }
                break;
            case ConnectionResult.SERVICE_MISSING:
                break;
            case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
                break;
            default:
        }
    }

希望这会对你有所帮助。