2013-09-05 4 views
7

Ich versuche, eine Markierung zu setzen, wenn der Benutzer auf Karte klickt. Ich verwende eine SupportMapFragment innerhalb einer ActionBarActivity. Aber die Karte antwortet nicht, außerdem funktioniert eine map.setMapType() Operation nicht.Android Google Maps v2: auf Klick-Listener reagiert nicht

Hier ist mein Code:

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 ist die „auf Sicht erstellt“ -Meldung zeigt und die Karte zeigt den aktuellen Standort mit einem Marker, so dass der letzte Teil des Codes ausgeführt wird. Aber die onMapClickListener ist übergangen oder etwas, weil es nicht funktioniert, und die Karte ist kein Satellit.

Kann mir jemand helfen?

Antwort

15

Wenn Sie SupportMapFragment erweitert haben, können Sie einfach tun:

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

Beachten Sie, dass getMap() in onActivityCreated genannt wird und inflater.inflate(R.layout.map, container, false) ist nicht erforderlich, wenn Sie ein eigenes Layout verwenden dont.

Sie brauchen nicht einmal ein map.xml-Layout!

Sie erweitern SupportMapFragment aber Sie sind Aufblasen eine andere MapView (nicht zu SupportMapFragment standardmäßig gebunden eins), das ist, warum Sie die Änderungen in der Karte nicht angezeigt wird. Weil Sie auf der Standardeinstellung View von getMap() gehandelt haben, aber Sie sehen eine andere. Siehe docs about getMap():

public final GoogleMap getMap() 

die zugrunde liegende GoogleMap Ruft die von diesem Fragmente eingewickelt zu der Ansicht gebunden ist.

Hoffe, es hilft;)

+0

Danke josuadas! Der Punkt ist, dass ich ein XML aufblasen muss, weil es keine Ansicht mit nur einer Karte ist. Ich denke, es ist immer noch notwendig, SupportMapFragment zu erweitern, oder? –

+0

Ez Horregatik! Meiner Meinung nach sollte man SupportMapFragment in diesem Fall nicht erweitern, sondern nur Fragment (aus der Support-Bibliothek). Siehe diesen Link: http://stackoverflow.com/questions/13804511/supportmapfragment-with-a-custom-layout-possible – josuadas

+0

Eine andere Möglichkeit besteht darin, das SupportMapFragment zu einer FragmentActivity hinzuzufügen, die nur den Platz für die Map einnimmt. F.i. Verwenden eines FrameLayout als Container in Ihrem FragmentActivity-Layout: http://developer.android.com/training/basics/fragments/fragment-ui.html#AddAtRuntime – josuadas

1

Statt Karte tun = getMap(), ein paar Zeilen später hatte ich diesen Code:

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

Also habe ich einfach den Code über dieser Linie und es ist getan.

+0

Hallo Jon!Ich denke, Sie können es einfacher machen, weil Sie sich bereits in der SupportMapFragment befinden, es ist nicht notwendig, das Fragment zu bekommen (es ist nützlich, wenn Sie von der FragmentAktivität anrufen). Ich habe eine Antwort hinzugefügt. – josuadas

0

Statt Karte tun = getMap() können Sie dies versuchen.

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

Nun, Sie platzieren einen Listener für Ihre Karte, aber Sie müssen einen Listener für Ihre Marker machen.

map.setOnMarkerClickListener(this); 

... 

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

oder für die Infofenster auf der Marker:

map.setOnInfoWindowClickListener(this); 

Auch Ihr initialitizing der Karte ist es zeigt Satelliten macht fast richtig:

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 

es ändern zu:

map.setMapType(GoogleMap.MAP_TYPE_HYBRID);