【问题标题】:How to have two Google Maps in the same Android Application如何在同一个 Android 应用程序中拥有两个谷歌地图
【发布时间】:2013-04-28 16:54:04
【问题描述】:

我的申请有问题。 一切都很好,但是当我需要在新的谷歌地图中添加两个标记时是不可能的,因为 mMap = (mMapFragment).getMap() 返回 null (我见过 Log.i) 我在第一个活动中已经有另一个地图,它显示了所有最近的标记,它工作得很好。

这是我的 DrawPathActivity

public class DrawPathActivity extends FragmentActivity  {
    private GoogleMap mMap;
    private GoogleMapOptions options = new GoogleMapOptions();
    private MapFragment mMapFragment;

    private PolylineOptions PolyOpt = new PolylineOptions();
    private Polyline polyline;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        mMapFragment = MapFragment.newInstance();
        setContentView(R.layout.activity_draw_path);
        options.mapType(GoogleMap.MAP_TYPE_NORMAL)
        .compassEnabled(true)
        .scrollGesturesEnabled(true)
        .zoomGesturesEnabled(true);
        MapFragment.newInstance(options);
        mMap = ((SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map1)).getMap();
        android.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.map1, mMapFragment);
        fragmentTransaction.commit();

        mMap.setMyLocationEnabled(true);
        Intent intent = getIntent();
        LatLng cpPos = new LatLng(intent.getExtras().getDouble("cp_lat"), intent.getExtras().getDouble("cp_lon"));
        LatLng poiPos = new LatLng(intent.getExtras().getDouble("POI_lat"), intent.getExtras().getDouble("POI_lon"));
        addMarkers(intent);

        PolyOpt.add(cpPos)
        .add(poiPos)
        .width(10)
        .color(Color.BLUE)
        .geodesic(true);
        polyline = mMap.addPolyline(PolyOpt);

        String url = makeURL(cpPos.latitude, cpPos.longitude, poiPos.latitude, poiPos.longitude);
        drawPath(url, true);

    }



    private void addMarkers(Intent intent) {
        Log.i("mMap ini", String.valueOf(mMap));
        Log.i("mMapFragment", String.valueOf(mMapFragment));
        LatLng cpPos = new LatLng(intent.getExtras().getDouble("cp_lat"), intent.getExtras().getDouble("cp_lon"));
        LatLng poiPos = new LatLng(intent.getExtras().getDouble("POI_lat"), intent.getExtras().getDouble("POI_lon"));
        mMap = (mMapFragment).getMap();  <<<---- mMap IS NULL!!!  

        Log.i("mMap", String.valueOf(mMap));
        mMap.addMarker(new MarkerOptions()
        .position(cpPos)
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.youarehere)));
        mMap.addMarker(new MarkerOptions()
        .position(poiPos)
        .title(intent.getExtras().getString("POI_name"))
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.poi_serena)));        
    }



    public static LatLng locationToLatLng(Location loc) {
        if(loc != null)
            return new LatLng(loc.getLatitude(), loc.getLongitude());
        return null;
    }

    public String makeURL (double sourcelat, double sourcelog, double destlat, double destlog ){
        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.googleapis.com/maps/api/directions/json");
        urlString.append("?origin=");// from
        urlString.append(Double.toString(sourcelat));
        urlString.append(",");
        urlString
        .append(Double.toString( sourcelog));
        urlString.append("&destination=");// to
        urlString
        .append(Double.toString( destlat));
        urlString.append(",");
        urlString.append(Double.toString( destlog));
        urlString.append("&sensor=false&mode=driving&alternatives=true");
        return urlString.toString();
    }







    public void drawPath(String  result, boolean withSteps) {

        try {
            //Tranform the string into a json object
            final JSONObject json = new JSONObject(result);
            JSONArray routeArray = json.getJSONArray("routes");
            JSONObject routes = routeArray.getJSONObject(0);
            JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
            String encodedString = overviewPolylines.getString("points");
            List<LatLng> list = decodePoly(encodedString);

            for(int z = 0; z<list.size()-1;z++){
                LatLng src= list.get(z);
                LatLng dest= list.get(z+1);
                Polyline line = mMap.addPolyline(new PolylineOptions()
                .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude))
                .width(10)
                .color(Color.BLUE).geodesic(true));
            }
            if(withSteps)
            {
                JSONArray arrayLegs = routes.getJSONArray("legs");
                JSONObject legs = arrayLegs.getJSONObject(0);
                JSONArray stepsArray = legs.getJSONArray("steps");
                //put initial point

                for(int i=0;i<stepsArray.length();i++)
                {
                    Step step = new Step(stepsArray.getJSONObject(i));
                    mMap.addMarker(new MarkerOptions()
                    .position(step.location)
                    .title(step.distance)
                    .snippet(step.instructions)
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

                }
            }

        } 
        catch (JSONException e) {

        }
    }

这是这个类的xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <CheckBox
            android:id="@+id/satellite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/satellite" />
    </LinearLayout>

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

</LinearLayout>

有人可以帮助我吗?并且可以解释地图是如何为空的? 因为我无法在地图上添加两个Marker,所以我无法完成我的工作。

谢谢大家。

【问题讨论】:

  • 请仅发布代码的相关部分。

标签: android google-maps path


【解决方案1】:

当您在 XML 中像这样定义 MapFragment 时,无需执行任何 FragmentTransaction。带有地图的片段就在那里。

所以在您的onCreate() 方法中尝试更改行

mMapFragment = MapFragment.newInstance();
setContentView(R.layout.activity_draw_path);
options.mapType(GoogleMap.MAP_TYPE_NORMAL)
.compassEnabled(true)
.scrollGesturesEnabled(true)
.zoomGesturesEnabled(true);
MapFragment.newInstance(options);
mMap = ((SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map1)).getMap();
android.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.map1, mMapFragment);
fragmentTransaction.commit();

setContentView(R.layout.activity_draw_path);
mMap = ((SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map1)).getMap();
// This is how you set up the map options in this case.
// Btw, you could maybe check if you don't set something that
// the map has set by default. I'd be surprised if scrollGestures
// or zoomGestures were disabled by default. Also the setting
// MAP_TYPE_NORMAL is I think useless as it should be the default.
mMap.getUiSettings().setCompassEnabled(true).setScrollGesturesEnabled(true).setZoomGesturesEnabled(true);

然后在addMarkers()方法中,可以删除mMap = (mMapFragment).getMap();这一行。您已经在onCreate() 方法中获得了对地图的引用。

应该可以,告诉我。

【讨论】:

  • 不,它不起作用,这是 LogCat '04-29 17:43:44.735: E/AndroidRuntime(6736): Caused by: android.view.InflateException: Binary XML文件第 19 行:膨胀类片段时出错 04-29 17:43:44.735: E/AndroidRuntime(6736): at it.tirocinio.Map.DrawPathActivity.onCreate(DrawPathActivity.java:51) 04-29 17:43:44.735 : E/AndroidRuntime(6736): 引起: java.lang.ClassCastException: com.google.android.gms.maps.MapFragment cannot be cast to android.support.v4.app.Fragment' 关于 LogCat 错误在 setContentView (R.layout.activity_draw_path) 但我不知道为什么。
  • 将 xml 中的 com.google.android.gms.maps.MapFragment 切换为 com.google.android.gms.maps.SupportMapFragment
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多