android GoogleMap为null,显示正常,但无法添加标记/折线

时间:2013-02-21 11:32:06

标签: android map null supportmapfragment

我有一个GoogleMap可以很好地显示(在SupportMapFragment中)并使用GoogleMapOptions作为目标摄像头位置。但是,我无法向GoogleMap添加标记/折线。以下是创建地图的方法:

private void createMap(List<LatLng> latLngs) {

    if(map == null) {
        GoogleMapOptions options = new GoogleMapOptions();
        mapFragment = SupportMapFragment.newInstance(options);
        map = mapFragment.getMap();

        float zoom = 13;
        CameraPosition cameraP = new CameraPosition(latLngs.get(0), zoom, 0, 0);
        options.camera(cameraP);


        //TODO MAP IS NULL - SORT OUT!
        // check it has been instantiated
        if (map != null) {
            Log.d(TAG, "map is not null");
            map.clear();
            //Calculate target zoom, based on trip size
            map.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraP));
            // Add LatLngs to polyline

            PolylineOptions poly = new PolylineOptions().color(Color.RED);
            MarkerOptions startMarker = new MarkerOptions()
                    .position(latLngs.get(0)).title("Start");
            MarkerOptions endMarker = null;
            if(latLngs.size() > 1) {
             endMarker = new MarkerOptions().position(
                    latLngs.get(latLngs.size() - 1)).title("End");  
            }

            for (LatLng latLng : latLngs) {
                poly.add(latLng);
            }

            map.addPolyline(poly);
            map.addMarker(startMarker);
            map.addMarker(endMarker);

        }


        ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.trip_summary_map_container, mapFragment);
        ft.commit();
    }
}

从内联注释中可以看出,地图仍为空(尽管它正在显示和使用选项)。只是不能添加东西。我假设我没有正确地实例化它?

活动扩展了FragmentActivity,我已经设置了使用Maps API所需的所有东西。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

编辑:我已经发布了new answer我想要使用的解决方案。

前几天我遇到了同样的问题,我解决了扩展SupportMapFragment类的问题,以便在地图最终准备就绪后执行回调方法。

public class ExtendedSupportMapFragment extends SupportMapFragment {

    public static interface MapReadyListener {
        public void mapIsReady(GoogleMap map);
    }

    @Deprecated
    public static SupportMapFragment newInstance() {
        return null;
    }

    @Deprecated
    public static SupportMapFragment newInstance(GoogleMapOptions options) {
        return null;
    }

    public static ExtendedSupportMapFragment newInstance(MapReadyListener mapReadyListener) {
        ExtendedSupportMapFragment fragment = new ExtendedSupportMapFragment();
        fragment.mapReadyListener = mapReadyListener;

        return fragment;
    }

    private MapReadyListener mapReadyListener;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (mapReadyListener != null)
            mapReadyListener.mapIsReady(getMap());
    }

}

然后你只需要做这样的事情:

public class RutaMapaFragment extends SherlockFragment implements ExtendedSupportMapFragment.MapReadyListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragmentMapa = ExtendedSupportMapFragment.newInstance(RutaMapaFragment.this);
    }

    ...

    @Override
    public void mapIsReady(GoogleMap map) {
        //Do whatever you want with your map.
    }

}

答案 1 :(得分:1)

所以,时间过去了。事实是我不再使用my previous answer中的解决方案,而是更喜欢使用ViewTreeObserver。以下代码显示了一个相当简单的片段,其中添加了SupportMapFragment

方法createMap()添加SupportMapFragment,然后执行setupMap(),但只能通过OnGlobalLayoutListener执行,一旦地图实际就绪,它将基本执行。当然,这个听众会被立即删除 - 不再需要将其保留在那里。

public class MyMapFragment extends Fragment {

    private View mMapContainer;
    private SupportMapFragment mMapFragment;
    private GoogleMap mMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(/* ... */);
        // ...

        mMapContainer = view.findViewById(R.id.map_fragment_container);
        createMap();

        return view;
    }

    private void createMap() {
        mMapFragment = new SupportMapFragment();

        getFragmentManager().beginTransaction()
                .replace(R.id.map_fragment_container, mMapFragment)
                .commit();

        mMapContainer.getViewTreeObserver()
                .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    @Override
                    public void onGlobalLayout() {
                        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
                            mMapContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        } else {
                            mMapContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        }

                        mMap = mMapFragment.getMap();
                        setupMap();
                    }

                });
    }

    private void setupMap() {
        mMap.setMyLocationEnabled(true);
        // ...
    }

}

答案 2 :(得分:0)

尝试添加标记&amp;使用以下代码在地图中使用PolyLines:

GoogleMap mMap;
static final CameraPosition BONDI =
        new CameraPosition.Builder().target(new LatLng(-33.891614, 151.276417))
                .zoom(15.5f)
                .bearing(300)
                .tilt(50)
                .build();
changeCamera(CameraUpdateFactory.newCameraPosition(BONDI));
    mMap.addMarker(new MarkerOptions().position(new LatLng(-33.891614, 151.276417)).title("Bondi"));
 private void changeCamera(CameraUpdate update) {
    changeCamera(update, null);
    }
/**
 * Change the camera position by moving or animating the camera depending on the state of the
 * animate toggle button.
 */
private void changeCamera(CameraUpdate update, CancelableCallback callback) {
    boolean animated = ((CompoundButton) findViewById(R.id.animate)).isChecked();
    if (animated) {
        mMap.animateCamera(update, callback);
    } else {
        mMap.moveCamera(update);
    }
}

添加PolyLines如下:

 // A simple polyline with the default options from Melbourne-Adelaide-Perth.
    mMap.addPolyline((new PolylineOptions())
            .add(BONDI));