2013-01-23 32 views
33

Używam Google Map API V2 i stworzyłem niestandardową InfoWindow dla Marker na mapie.W tym InfoWindow mam przycisk.Niestandardowe infowindow w Google map android v2

Mój problem nie jest w stanie ustawić Onclicklistener/funkcjonujący do tego przycisku jeden (obojętne) .Any dać mi jakiś pomysł, aby rozwiązać ten:

enter image description here

Oto fragment kodu:

public class MarkerView extends FragmentActivity implements OnMarkerClickListener,OnInfoWindowClickListener{ 

private GoogleMap mMap; 
private Marker chennai; 
private View infoWindow; 
@Override 
protected void onCreate(Bundle arg0) { 
    super.onCreate(arg0); 
    setContentView(R.layout.basic_demo); 

    infoWindow=getLayoutInflater().inflate(R.layout.custom_info_contents, null); 

    mMap=((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
    chennai=mMap.addMarker(new MarkerOptions().position(new LatLng(13.0810, 80.274)).anchor(2, 1).title("Android").snippet("Snippet").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))); 
    mMap.setInfoWindowAdapter(new CustomInfoAdapter()); 
    mMap.setOnInfoWindowClickListener(null); 
    mMap.setOnMarkerClickListener(this); 
    Button dummy=(Button) infoWindow.findViewById(R.id.dummy); 
    dummy.setVisibility(View.VISIBLE); 
    dummy.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(MarkerView.this, "Dummy Button", Toast.LENGTH_SHORT).show(); 

     } 
    }); 
} 


class CustomInfoAdapter implements InfoWindowAdapter{ 


    @Override 
    public View getInfoContents(Marker arg0) { 
     displayView(arg0); 
     return infoWindow; 
    } 

    @Override 
    public View getInfoWindow(Marker arg0) { 

     return null; 
    } 


} 


public void displayView(Marker arg0) { 

    ((ImageView)infoWindow.findViewById(R.id.badge)).setImageResource(R.drawable.arrow); 
    ((ImageView)infoWindow.findViewById(R.id.badge)).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(MarkerView.this, "Arrow Image", Toast.LENGTH_SHORT).show(); 

     } 
    }); 
    ((TextView)infoWindow.findViewById(R.id.title)).setText(arg0.getTitle()); 
    ((TextView)infoWindow.findViewById(R.id.snippet)).setText(arg0.getTitle()); 

} 


@Override 
public boolean onMarkerClick(Marker arg0) { 
    if(arg0.equals(chennai)){ 

     infoWindow.setClickable(false); 

    } 
    return false; 
} 


@Override 
public void onInfoWindowClick(Marker arg0) { 
    Toast.makeText(MarkerView.this, "Info window", Toast.LENGTH_SHORT).show(); 
} 
+0

Spróbuj, view = (Zobacz) findViewById (R.id.your_custom_info_window_layout); bDummy = przycisk (przycisk) widok \t \t \t \t \t \t .findViewById (R.id.button_dummy); bDummy.setOnclick ... może ci pomóc – TamiL

+0

Tak, już wypróbowany.Nie używaj. – SBK

+0

Czy możesz opublikować swój kod, a ja zajrzę do niego .. – TamiL

Odpowiedz

32

Proszę zapoznać się z Informacje w okienku kliknij zdarzenia w tym link

Okno informacyjne nie jest widokiem na żywo, a widok jest renderowany jako obraz na mapie. W rezultacie każdy detektor ustawiony w widoku jest pomijany i nie można rozróżnić zdarzeń kliknięcia w różnych częściach widoku. Nie zaleca się umieszczania interaktywnych komponentów - takich jak przyciski, pola wyboru lub dane wejściowe tekstu - w niestandardowym oknie informacyjnym.

+8

Ah, zrób tak, jak mówię, nie tak jak ja, huh Google? Mapy Google mają dwa przyciski dotykowe w aplikacji InfoWindow. Wyszukiwanie czegoś zapewnia podzieloną na segmenty usługę InfoWindow, w której można dotknąć ikony Nawigacja, aby uzyskać wskazówki lub tekst, aby uzyskać więcej informacji o punkcie szczególnym. – Greg

+0

Smutne, gdybyśmy tylko mogli użyć projektu MapViewBalloons dla starego api mapy. https://github.com/jgilfelt/android-mapviewballoons –

+0

To wyjaśnia, dlaczego nie mogę kliknąć mojego banera AdMob umieszczonego w InfoWindowAdapter – Bevor

17

Musisz zaimplementować niestandardowy znacznik; To jest tak:

custommarker.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center_vertical|center_horizontal" 
android:background="#ADD8E6" 
android:gravity="center_vertical|center_horizontal" 
android:orientation="horizontal" > 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="5dp" 
    android:adjustViewBounds="true" 
    android:contentDescription="@string/app_name" 
    android:src="@drawable/sabarmati" /> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/snippet" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="5dp" 
     android:textColor="@android:color/black" 
     android:textSize="15sp" /> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="5dp" 
     android:textColor="@android:color/black" 
     android:textSize="10sp" 
     android:textStyle="bold" /> 
</LinearLayout> 

</LinearLayout> 

aktywny:

public class PlacesMapActivity extends android.support.v4.app.FragmentActivity 
    implements OnClickListener, LocationListener { 
/** 
* Note that this may be null if the Google Play services APK is not 
* available. 
*/ 
ImageButton btn_home; 
private GoogleMap mMap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 

    SupportMapFragment fragment = (SupportMapFragment)getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mMap = fragment.getMap(); 
    mMap.setMyLocationEnabled(true); 

    // mMap = ((SupportMapFragment) getSupportFragmentManager() 
    // .findFragmentById(R.id.map)).getMap(); 

    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.title("First Location"); 
    markerOptions.snippet("This Is Test Location"); 

    LatLng latlng = new LatLng(23.0333, 72.6167); 

    markerOptions.position(latlng); 
    // markerOptions.title("Ahmedabad Cordinat Found here"); 

    // Marker m = mMap.addMarker(markerOptions); 

    ***mMap.setInfoWindowAdapter(new InfoWindowAdapter() { 
     @Override 
     public View getInfoWindow(Marker arg0) { 
      return null; 
     } 
     @Override 
     public View getInfoContents(Marker marker) { 
      View myContentView = getLayoutInflater().inflate(
        R.layout.custommarker, null); 
      TextView tvTitle = ((TextView) myContentView 
        .findViewById(R.id.title)); 
      tvTitle.setText(marker.getTitle()); 
      TextView tvSnippet = ((TextView) myContentView 
        .findViewById(R.id.snippet)); 
      tvSnippet.setText(marker.getSnippet()); 
      return myContentView; 
     } 
    });*** 

    mMap.addMarker(new MarkerOptions() 
      .position(latlng) 
      .title("This is Sabarmati Ashram") 
      .snippet("Ahmedabad") 
      .icon(BitmapDescriptorFactory 
       .defaultMarker(BitmapDescriptorFactory.HUE_RED))); 

    mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 

     @Override 
     public void onInfoWindowClick(Marker arg0) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(getBaseContext(), 
        DetailsOfPlacesActivity.class); 
      startActivity(intent); 
     } 
    }); 

    btn_home = (ImageButton) findViewById(R.id.activity_map_ibtn_home); 
    btn_home.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      finish(); 
     } 
    }); 
} 
} 
+0

Tajemnicą jest setOnInfoWindowClickListener. Idealny. – SolArabehety

+2

W jaki sposób uzyskuje się kliknięcie części okna informacyjnego? Nie widzę, jak to by działało. – Barodapride

+0

Jesteś moim bohaterem !!! Dzięki, zrobiłeś mój dzień !!! – Cabezas

0

UI elementy wewnątrz InfoWindow który pojawi się na markery Mapy Google nie są klikalne. Więc lepiej używać niestandardowych pop-upów.

0

Nie można kliknąć przycisku ze względu na the reason explained by @TamiL.
Można jednak kliknąć InfoWindow, więc przechowywać identyfikator (-y) z Marker (-ów), którego InfoWindow (y) powinny być klikalne, dodać GoogleMap.OnInfoWindowClickListener na mapie tak:

map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 
{ 
    @Override 
    public void onInfoWindowClick(Marker marker) 
    { 
     // Called when ANY InfoWindow is clicked 
    } 
}); 

Następnie , gdy wywoływana jest nazwa onInfoWindowClick, porównaj kliknięty identyfikator Marker z zapisanym wcześniej, a jeśli którykolwiek z nich jest zgodny, wykonaj dowolny kod, który powinien zostać wykonany w detektorze kliknięć Button.

Nie musisz zajmować się zapisywaniem identyfikatora Marker ID: s, jeśli wszystkie twoje Marker s będą gotowe do kliknięcia!

1

Mam zbudować przykładowy projekt studio Android na to pytanie.

Możesz więc utworzyć niestandardowe infowindowskie mapy Google v2 z klikalnymi przyciskami lub ImageView itp., Ekran

wyjścia strzały: -

enter image description here

enter image description here

enter image description here

Pobierz pełny kod źródłowy projektu Kliknijhere

Uwaga: trzeba dodać swój klucz API w AndroidManifest.xml

+1

może przesłać go na github lub inne repo. –

Powiązane problemy