2013-09-02 11 views
16

enter image description hereGoogle Map v2 klienta Infowindow z dwoma przyciskami lub klikalne ImageView

muszę niestandardowe okno informacyjne z dwoma klikalny link jako above.In tym bardziej wtedy, gdy znacznik i kliknij jeden z nich wtedy okno powinno być otwarte i kiedy kliknij na inny znacznik, kolejne okno powinno otwierać i zamykać poprzednie okno oraz jedno kliknięcie. Czy jest jakiś konkretny powód, dla którego google map v2 nie obsługuje składnika aktywnego, takiego jak przycisk, pole wyboru?

+0

Wykorzystanie niestandardowych okienko przy użyciu adaptera map.setInfoWindowAdapter (nowe PopupAdapterTodays (getLayoutInflater (bundle), kontekst)); –

+2

tak, ale jak mogę uzyskać dwie różne akcje, na przykład pokaż pierwszą aktywność na pierwszym przycisku i drugą aktywność na drugim przycisku w infowindow. –

+0

możesz utworzyć niestandardowy układ w adapterze, w którym możesz mieć dwa przyciski ze słuchaczami –

Odpowiedz

3

To, co próbujesz osiągnąć, nie jest możliwe. Nawet jeśli utworzysz układ xml dla twojego okna informacyjnego. Zawartość okna informacji jest renderowana i prezentowana jako obraz na mapach. Więc może przyjąć tylko jednego odbiornika kliknięcia dla całego okna. nie można określić liczby różnych kliknięć tego okna.

UPDATE: Z Docs:

Uwaga: Okno informacji, które jest zasysane nie jest widok na żywo. Widok jest renderowany jako obraz (przy użyciu View.draw (Canvas)) w momencie, gdy jest zwracany. Oznacza to, że wszelkie późniejsze zmiany w widoku nie zostaną odzwierciedlone w oknie informacyjnym na mapie. Aby później zaktualizować okno informacyjne (np. Po wczytaniu obrazu), wywołaj metodę showInfoWindow(). Co więcej, okno informacyjne nie będzie respektowało żadnej interaktywności typowej dla normalnego widoku, takiej jak zdarzenia dotykowe lub gesty. Możesz jednak usłyszeć ogólne zdarzenie kliknięcia w całym oknie informacyjnym, zgodnie z opisem w sekcji poniżej.

+0

w aplikacji google map api v1 już korzystam z nakładki niestandardowej, ale w wersji 2 nie jest to możliwe –

+0

możesz trzasnąć edycję z dokumentacji, co próbujesz zrobić, nie jest możliwe dla V2 –

4

MainActivity.java

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public class MainActivity extends Activity { 

    private ViewGroup infoWindow; 
    private TextView infoTitle; 
    private TextView infoSnippet; 
    private Button infoButton1, infoButton2; 
    private OnInfoWindowElemTouchListener infoButtonListener; 

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

    final MapFragment mapFragment = 
     (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    final MapWrapperLayout mapWrapperLayout = 
     (MapWrapperLayout) findViewById(R.id.map_relative_layout); 
    final GoogleMap map = mapFragment.getMap(); 


    mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20)); 

    final Marker ki = map.addMarker(new MarkerOptions() 
     .position(new LatLng(50.08, 14.43)) 
     .icon(BitmapDescriptorFactory 
      .fromResource(R.drawable.circles))); 

    infoWindow = (ViewGroup) getLayoutInflater() 
     .inflate(R.layout.activity_main, null); 
    infoButton1 = (Button) infoWindow.findViewById(R.id.b1); 
    infoButton2 = (Button) infoWindow.findViewById(R.id.b2); 

    infoButtonListener = new OnInfoWindowElemTouchListener(infoButton1, 
     getResources().getDrawable(R.drawable.ic_launcher), 
     getResources().getDrawable(R.drawable.ic_launcher)) { 
     @Override 
     protected void onClickConfirmed(View v, Marker marker) { 
     Toast.makeText(getApplicationContext(), 
      "click on button 1", Toast.LENGTH_LONG).show(); 
     } 
    }; 
    infoButton1.setOnTouchListener(infoButtonListener); 


    infoButtonListener = new OnInfoWindowElemTouchListener(infoButton2, 
     getResources().getDrawable(R.drawable.ic_launcher), 
     getResources().getDrawable(R.drawable.ic_launcher)) { 
     @Override 
     protected void onClickConfirmed(View v, Marker marker) { 
     Toast.makeText(getApplicationContext(), 
      "click on button 2", Toast.LENGTH_LONG).show(); 
     } 
    }; 
    infoButton2.setOnTouchListener(infoButtonListener); 

    infoWindow.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     // TODO Auto-generated method stub 
     } 
    }); 

    map.setInfoWindowAdapter(new InfoWindowAdapter() { 
     @Override 
     public View getInfoWindow(Marker marker) { 
     infoButtonListener.setMarker(marker); 
     mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow); 
     return infoWindow; 
     } 

     @Override 
     public View getInfoContents(Marker marker) { 
     // Setting up the infoWindow with current's marker info 
     return null; 
     } 
    }); 
    ki.showInfoWindow(); 

    map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.08, 14.43), 15)); 
    map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 
    } 

    public static int getPixelsFromDp(Context context, float dp) { 
    final float scale = context.getResources().getDisplayMetrics().density; 
    return (int) (dp * scale + 0.5f); 
    } 
} 

activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:background="@drawable/marker" > 

     <Button 
      android:id="@+id/b1" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="Button1" 
      android:layout_marginBottom="10dp" /> 

     <Button 
      android:id="@+id/b2" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="Button2" 
      android:layout_marginBottom="10dp" /> 

    </LinearLayout> 
</RelativeLayout> 

teraz skopiuj następujące pliki z linku https://stackoverflow.com/a/15040761/2183804

  1. mapwrapperlauot (zawierać nazwę pakietu w tagu)
  2. MapWrapperLayout .java
  3. OnInfoWindowElemTouchListener.java

Będzie ona działać.

+0

I Uważasz, że musisz utworzyć 'OnInfoWindowElemTouchListener' dla każdego przycisku. Twój kod może działać bez wyjątku, ponieważ wyświetlasz tylko toastowe wyskakujące okienko, które nie ma nic wspólnego z konkretnym znacznikiem. Jeśli spróbujesz wyświetlić tytuł znacznika po kliknięciu przycisku "infoButton1", otrzymasz "punkt zerowy wyjątku". – korujzade

1

mam budować przykładowy android projekt studyjny na to pytanie.

zrzuty ekranu wyjścia: -

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

Powiązane problemy