2013-04-28 2 views
0

У меня проблема с моим приложением. Все работает очень хорошо, но когда мне нужно добавить два маркера в новый статус Карты Google, это невозможно, потому что mMap = (mMapFragment) .getMap() возвращает null (я видел с Log.i) Я уже иметь другую карту в первом действии, которая показывает все ближайшие маркеры, и она работает ОЧЕНЬ хорошо.Как использовать два Google Maps в одном приложении для Android

Это мой 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> 

Кто-то может мне помочь? И может объяснить, как карта равна нулю? Потому что я не могу добавить два маркера на карту, и я не могу закончить свою работу.

Спасибо всем.

+0

Пожалуйста, разместите только соответствующие части кода. – zbr

+0

@ Zabri Done, извините! – Fabio

ответ

0

Когда вы определяете MapFragment как это в вашем XML, нет необходимости выполнять какие-либо 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().

Должен работать, дайте мне знать.

+0

Нет, это не работает, это часть LogCat '04 -29 17: 43: 44.735: E/AndroidRuntime (6736): Caused by: android.view.InflateException: двоичная строка XML-файла # 19: Ошибка раздувание класс фрагмент 04-29 17: 43: 44,735: Е/AndroidRuntime (6736): \t на 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 не может быть добавлено в android.support.v4.app.Fragment ' О журнале LogCat ошибка включена setContentView (R.layout.activity_draw_path), но я не знаю почему. – Fabio

+0

Переключите 'com.google.android.gms.maps.MapFragment' в свой xml на' com.google.android.gms.maps.SupportMapFragment'. – zbr

Смежные вопросы