2013-09-05 25 views
7

Kullanıcı haritaya tıkladığında işaretçi koymaya çalışıyorum. ActionBarActivity'un içinde bir SupportMapFragment kullanıyorum. Ancak harita yanıt vermiyor, ayrıca map.setMapType() işlemi çalışmıyor.Android Google Maps v2: click dinleyici yanıt vermiyor

İşte benim kod:

private GoogleMap map; 
private Marker marker; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    ActionBarActivity activity = (ActionBarActivity) getActivity(); 
    activity.getSupportActionBar().setTitle(R.string.select_location); 
    super.onCreateView(inflater, container, savedInstanceState); 
    return inflater.inflate(R.layout.map, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    Log.d("Map","On view created"); 
    map = getMap(); 
      map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    map.setOnMapClickListener(new OnMapClickListener() { 

     @Override 
     public void onMapClick(LatLng point) { 
      Log.d("Map","Map clicked"); 
      marker.remove(); 
      drawMarker(point); 
     } 
    }); 

     ... 
     Location location = locationManager.getLastKnownLocation(provider); 

     if(location!=null){ 
      //PLACE THE INITIAL MARKER    
      drawMarker(new LatLng(location.getLatitude(),location.getLongitude())); 
     } 
} 

Logcat "görünüm oluşturulmuş" iletisini gösteriyor ve harita bir işaretleyici ile mevcut konumu gösterir, bu nedenle kodunun son bölümü yürütülmektedir. Ancak, onMapClickListener geçersiz kılınmış ya da bir şey çalışmıyor çünkü çalışmaz ve harita uydu değildir.

Herkes bana yardım edebilir mi? Bunun yerine harita yapmanın

cevap

15

sadece bunu yapabilirsiniz: GetMap() onActivityCreated yılında denir ve özel bir düzen kullanmak düğünle eğer inflater.inflate(R.layout.map, container, false) gerekli olmadığını

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ActionBarActivity activity = (ActionBarActivity) getActivity(); 
    activity.getSupportActionBar().setTitle(R.string.select_location); 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    map = getMap(); 
    map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    map.setOnMapClickListener(new OnMapClickListener() { 

    @Override 
    public void onMapClick(LatLng point) { 
     Log.d("Map","Map clicked"); 
     marker.remove(); 
     drawMarker(point); 
    } 
}); 

Not.

Bir map.xml düzenine bile ihtiyacınız yok!

haritanıza değişiklikleri görüntülemiyorsanız neden that's, Sen SupportMapFragment uzatıyoruz ancak başka MapView (varsayılan olarak SupportMapFragment bağlı olmayan bir) şişirme edilmektedir. Varsayılan View üzerinde hareket ettiğiniz için getMap()'dan edinildi, ancak başka bir tane görüyorsunuz.

public final GoogleMap getMap() 

bu fragmanı ile sarılmış bir görünüme bağlı olduğu altta yatan GoogleMap alır: docs about getMap() bakınız.

Umarım yardımcı olur;)

+0

Teşekkürler josuadas! Asıl nokta, bir XML'i şişirmem gerektiğidir, çünkü bu sadece bir harita ile değil. SupportMapFragment'i genişletmenin hala gerekli olduğunu düşünüyorum, değil mi? –

+0

Ez horregatik! Benim düşünceme göre bu durumda SupportMapFragment'i genişletmemelisiniz, sadece Fragment (destek kütüphanesinden). Bu bağlantıya bakın: http://stackoverflow.com/questions/13804511/supportmapfragment-with-a-custom-layout-possible – josuadas

+0

Başka bir olasılık da, SupportMapFragment'i haritaya yer açmak için bir FragmentActivity'e eklemektir. A.G. FragmentActivity düzeninizde kapsayıcı olarak bir FrameLayout kullanarak: http://developer.android.com/training/basics/fragments/fragment-ui.html#AddAtRuntime – josuadas

1

= GetMap(), birkaç satır sonra ben bu kodu vardı:

 SupportMapFragment fm = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 
     map = fm.getMap(); 

Yani sadece o çizginin üzerinde kodunu koyduk ve bitti. Eğer SupportMapFragment genişletilmiş varsa

+0

Merhaba Jon!Daha kolay bir şekilde yapabileceğinizi düşünüyorum, çünkü zaten SupportMapFragment'indeyseniz, Fragmanı elde etmek gerekli değildir (FragmentActivity'den aradığınızda yararlıdır). Bir cevap ekledim. – josuadas

0

yerine haritayı yapmanın = GetMap() Bunu deneyebilirsiniz.

if (map == null) { 
    // Try to obtain the map from the SupportMapFragment. 
    this.map = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapView)) 
     .getMap(); 
    setUpMap(lat, longi, R.drawable.marker2, title); 
} 

private void setUpMap(double lat, double lng, int drawableResource, String title) { 
    if(map != null) { 
     marker = map.addMarker(new MarkerOptions().position(new LatLng(lat, lng)) 
       .title(title) 
       .icon(BitmapDescriptorFactory.fromResource(drawableResource))); 
     geocoder = new Geocoder(this, Locale.getDefault()); 
     map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 15)); 
     map.animateCamera(CameraUpdateFactory.zoomTo(13), 2500, null); 
    } 
} 
2

Harita için bir dinleyici yerleştiriyorsunuz, ancak işaretçileriniz için bir dinleyici oluşturmanız gerekiyor.

map.setOnMarkerClickListener(this); 

... 

@Override 
public boolean onMarkerClick(Marker arg0) {  
    Log.i(TAG,"marker arg0 = "+arg0);    
    return false; 
} 

veya belirteçleri üzerine InfoWindows için

:

map.setOnInfoWindowClickListener(this); 
Ayrıca

, bu satelite göstermek yapma haritanın sizin initialitizing neredeyse doğrudur:

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 

değiştirecektirler için:

map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
İlgili konular