2013-09-05 10 views
7

Próbuję umieścić znacznik, gdy użytkownik kliknie na mapie. Używam SupportMapFragment wewnątrz ActionBarActivity. Ale mapa nie odpowiada, a ponadto operacja map.setMapType() nie działa.Android Google Maps v2: odbiornik kliknięcia nie odpowiada

Oto mój 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 pokazuje komunikat „stworzony” na widoku, a mapa pokazuje aktualną pozycję z markerem, więc ostatnia część kodu jest wykonywany. Ale onMapClickListener jest nadpisany lub coś, ponieważ nie działa, a mapa nie jest satelitą.

Czy ktoś może mi pomóc?

Odpowiedz

15

Jeśli rozszerzony SupportMapFragment można po prostu to zrobić:

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

Zauważ, że GetMap() jest wywoływana w onActivityCreated i inflater.inflate(R.layout.map, container, false) nie jest konieczne, jeśli Do not używać niestandardowy układ.

Nie potrzebujesz nawet układu map.xml!

Rozszerzasz SupportMapFragment, ale napompujesz kolejny MapView (nie ten, który jest domyślnie powiązany z SupportMapFragment), dlatego nie wyświetlasz zmian na mapie. Ponieważ działałeś domyślnie View kupiony od getMap(), ale oglądasz inny. Zobacz docs about getMap():

public final GoogleMap getMap() 

Pobiera podstawowej kalkulacji, który jest przywiązany do widoku owinięty przez ten fragmentu.

Nadzieja pomaga;)

+0

Dzięki josuadas! Chodzi o to, że muszę nadmuchać XML, ponieważ nie jest to widok z samą mapą. Myślę, że nadal konieczne jest rozszerzenie SupportMapFragment, prawda? –

+0

Ez horregatik! Moim zdaniem nie powinieneś rozszerzać SupportMapFragment w tym przypadku, ale tylko Fragment (z biblioteki wsparcia). Zobacz ten link: http://stackoverflow.com/questions/13804511/supportmapfragment-with-a-ustom-layout-possible – josuadas

+0

Inną możliwością jest dodanie SupportMapFragment do FragmentActivity po prostu zajmując miejsce na mapie. F.i. używanie FrameLayout jako kontenera w układzie FragmentActivity: http://developer.android.com/training/basics/fragments/fragment-ui.html#AddAtRuntime – josuadas

1

Zamiast robić mapę = GetMap(), kilka linii później miałem ten kod:

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

Więc ja po prostu umieścić kod powyżej tej linii i to zrobić.

+0

Cześć Jon!Myślę, że możesz zrobić to w łatwiejszy sposób, ponieważ jesteś już w SupportMapFragment, nie jest konieczne uzyskanie Fragmentu (jest to przydatne, gdy dzwonisz z FragmentActivity). Dodałem odpowiedź. – josuadas

0

Zamiast robić mapę = GetMap() można spróbować.

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

Umieszczasz słuchacza dla swojej mapy, ale musisz zrobić słuchacza dla swoich znaczników.

map.setOnMarkerClickListener(this); 

... 

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

lub dla InfoWindows na szczycie markerów:

map.setOnInfoWindowClickListener(this); 

Również Twój initialitizing mapy czyni go pokazać Satelite jest prawie poprawne:

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 

zmiana go na:

map.setMapType(GoogleMap.MAP_TYPE_HYBRID);