2012-12-16 10 views
55

Czy ktoś wie, jak dodać fragment multilinii do znacznika Google Maps? To mój kod do dodawania znaczników:Android Google Maps v2: Jak dodać znacznik z kodem wieloliniowym?

map.getMap().addMarker(new MarkerOptions() 
    .position(latLng()).snippet(snippetText) 
    .title(header).icon(icon)); 

Chcę fragment wyglądać tak:

| HEADER | 
|foo  | 
|bar  | 

ale gdy próbuję ustawić snippetText do "foo \ n bar", widzę tylko foo bar i nie mam żadnych pomysłów, jak zrobić multiline. Możesz mi pomóc?

Odpowiedz

51

Wygląda na to trzeba będzie tworzyć własne „Info okno” zawartość, aby tę pracę:

  1. Utwórz realizację InfoWindowAdapter że nadpisuje getInfoContents() do powrotu, co chcesz, aby przejść do ramki InfoWindow

  2. połączeń setInfoWindowAdapter() na swojej GoogleMap, przekazując instancję Twój InfoWindowAdapter

This sample project demonstruje technikę. Zastąpienie fragmentów przez "foo\nbar" poprawnie przetwarza znak nowej linii. Jednak bardziej prawdopodobne jest, że po prostu opracujesz układ, który pozwoli uniknąć nowej linii z osobnymi widżetami TextView dla każdej linii w pożądanych wynikach wizualnych.

+0

Jeśli używasz getInfoWindow(), aby powrócić zupełnie niestandardowy widok pamiętać, że nie wydaje się być błąd przy użyciu RelativeLayout dla niego. Mogłem tylko zmusić mnie do pracy po przejściu na LinearLayout. Złożyłem zgłoszenie błędu: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4874 – Till

+0

@Till: Normalnie, gdy używasz zasobu układu z 'RelativeLayout' jako root, kiedy go nadmuchujesz, chcesz użyć trzyparametrowej metody "inflate()", przekazując rodzicowi 'ViewGroup' i' false' dla dwóch ostatnich parametrów. Jednakże nie przekazujemy rodzica w 'getInfoContents()', więc nie możemy tego zrobić. Chociaż jestem nieco zaskoczony "NullPointerException", nie jestem zaskoczony, że 'RelativeLayout' nie działa poprawnie. Spodziewałbym się niektórych reguł układu dla dzieci "RelativeLayout", które należy zignorować lub w inny sposób źle się zachowywać. – CommonsWare

+0

@CommonsWare Czytam 'Map V2 Chapter' od twoich 4.6 książka i mam pytanie, które jest tematem tego pytania, więc myślę, że jest to dobre miejsce do zadawania pytań. Przechodzę, czy istnieje jakiś sposób ustawienia odrębnego 'infoWindow' dla każdego znacznika, o ile' setInfoWindowAdapter() 'zostanie zastosowane do mapy otworów? – AlexAndro

82

mam zrobić z najprostszy sposób jak poniżej:

private GoogleMap mMap; 

Podczas dodanieznacznik na Google Map:

LatLng mLatLng = new LatLng(YourLatitude, YourLongitude); 

mMap.addMarker(new MarkerOptions().position(mLatLng).title("My Title").snippet("My Snippet"+"\n"+"1st Line Text"+"\n"+"2nd Line Text"+"\n"+"3rd Line Text").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 

Po tym zamieszczam poniżej kod dla InfoWindowadapter na Google Map:

mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 

     @Override 
     public View getInfoWindow(Marker arg0) { 
     return null; 
     } 

     @Override 
     public View getInfoContents(Marker marker) { 

     LinearLayout info = new LinearLayout(mContext); 
     info.setOrientation(LinearLayout.VERTICAL); 

     TextView title = new TextView(mContext); 
     title.setTextColor(Color.BLACK); 
     title.setGravity(Gravity.CENTER); 
     title.setTypeface(null, Typeface.BOLD); 
     title.setText(marker.getTitle()); 

     TextView snippet = new TextView(mContext); 
     snippet.setTextColor(Color.GRAY); 
     snippet.setText(marker.getSnippet()); 

     info.addView(title); 
     info.addView(snippet); 

     return info; 
    } 
}); 

nadzieję, że to pomoże.

+0

To dobre rozwiązanie, ale nie całkowite. Obsługuje nowe linie, ale pomija tytuł. To dobry początek, a reszta powinna być łatwa dla większości. –

+1

To rozwiązanie działa. +1 za dodanie próbki kodu. – MetaSnarf

+1

Obsługuje tytuł i wiele wierszy fragmentów. Dzięki. – Yar

13

Opierając się na Hiren Patel's answer jako Andrew S zaproponował:

mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 

     @Override 
     public View getInfoWindow(Marker arg0) { 
      return null; 
     } 

     @Override 
     public View getInfoContents(Marker marker) { 

      Context context = getApplicationContext(); //or getActivity(), YourActivity.this, etc. 

      LinearLayout info = new LinearLayout(context); 
      info.setOrientation(LinearLayout.VERTICAL); 

      TextView title = new TextView(context); 
      title.setTextColor(Color.BLACK); 
      title.setGravity(Gravity.CENTER); 
      title.setTypeface(null, Typeface.BOLD); 
      title.setText(marker.getTitle()); 

      TextView snippet = new TextView(context); 
      snippet.setTextColor(Color.GRAY); 
      snippet.setText(marker.getSnippet()); 

      info.addView(title); 
      info.addView(snippet); 

      return info; 
     } 
    }); 
Powiązane problemy