0

(SupportMapFragment 内で) 正常に表示され、ターゲット カメラの位置に GoogleMapOptions を使用する GoogleMap があります。ただし、マーカー/ポリラインを 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();
    }
}

インライン コメントからわかるように、マップはまだ null です (ただし、オプションを表示して使用しています)。それに物事を追加することはできません。私はそれを適切にインスタンス化していないと思いますか?

Activity は FragmentActivity を拡張し、Maps API を使用するために必要なものをすべてセットアップしました。

助けてくれてありがとう。

4

3 に答える 3

2

編集:私は今使用したいソリューションで新しい回答を投稿しました。

私は数日前に同じ問題を抱えていましたが、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.
    }

}
于 2013-03-11T09:54:26.860 に答える
1

それで、時間が経ちました。実際、以前の回答のソリューションはもう使用していませんが、代わりに a を使用することを好みますViewTreeObserverSupportMapFragment次のコードは、が追加された単純なフラグメントを示しています。

このメソッド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);
        // ...
    }

}
于 2014-07-30T09:00:18.743 に答える
0

以下のコードを使用して、マップにマーカーとポリラインを追加してみてください。

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);
    }
}

以下のようにポリラインを追加します。

 // A simple polyline with the default options from Melbourne-Adelaide-Perth.
    mMap.addPolyline((new PolylineOptions())
            .add(BONDI));
于 2013-02-21T13:03:07.497 に答える