2013-06-17 10 views
15

Per raggiungere questo risultato, ho semplicemente bisogno di ignorare onMarkerClick e verificare se la finestra Informazioni del marker cliccato è già stata aperta, ma con mia sorpresa clickedMarker.isInfoWindowShown() restituire sempre false. ..Nascondi informazioniWindow quando si fa clic sull'indicatore la seconda volta (API Android di Google Maps V2)

miei codici:

@Override 
public boolean onMarkerClick(final Marker clickedMarker) { 
    if(clickedMarker.isInfoWindowShown()) { 
     clickedMarker.hideInfoWindow(); 
     System.out.println("was showing"); 
    } else { 
     clickedMarker.showInfoWindow(); 
     System.out.println("not showing"); 
    } 
} 

mi dice sempre l'infowindow è "non mostra", che non è giusto ... posso ottenere intorno a questo mantenendo un riferimento di userLastClickedMarker ma mi piacerebbe per sapere dove ho sbagliato sopra.

Grazie!

Edit:

ho cambiato il mio codice per eseguire il debug il problema:

System.out.println(clickedMarker.isInfoWindowShown()); 
    if(clickedMarker.isInfoWindowShown()) { 
     clickedMarker.hideInfoWindow(); 
     System.out.println(" showing"); 
    } else { 
     clickedMarker.showInfoWindow(); 
     System.out.println("not showing"); 
    } 
    System.out.println(clickedMarker.isInfoWindowShown()); 

ho scoperto che isInfoWindowShown() funziona correttamente nel metodo onMarkerClick ma non si 'ricordo' in modo corretto. E ho trovato questo è stato sottolineato come un bug da qualcuno già ...

https://code.google.com/p/gmaps-api-issues/issues/detail?id=5408

+0

Si può provare a chiamare il codice con un piccolo ritardo usando 'Handler'. Suggerisco anche di inserire un link a questa domanda come commento all'emissione 5048. –

+0

Hai trovato dei problemi? Sto affrontando lo stesso problema. – Geek

+0

ricorda di inserire il bug nel collegamento per favore, se raggiungi questo post. – Poutrathor

risposta

-1

creo questo codice per mostrare/nascondere infowindow.

enter code here 

private boolean infoWindowIsShow = false; 
private Marker lastMarker; 

private class MarkerClickListener implements GoogleMap.OnMarkerClickListener { 
    @Override 
    public boolean onMarkerClick(Marker marker) { 

     //обработка выводить/не выводить инфовиндов 
     if(lastMarker == null){ 
      marker.showInfoWindow(); 
      lastMarker = marker; 
      infoWindowIsShow=true; 
     }else 
     if (marker.getId().equals(lastMarker.getId())) { 
      if (infoWindowIsShow) { 
       marker.hideInfoWindow(); 
       infoWindowIsShow = false; 
      } else { 
       marker.showInfoWindow(); 
       infoWindowIsShow = true; 
      } 
     } 
     else{ 
      //это щелчок по другому маркеру 
      if (infoWindowIsShow) {//если открыто инфовиндов предыдущего маркера, скрываем его 
       lastMarker.hideInfoWindow(); 
       //и отображаем для нового 
       marker.showInfoWindow(); 
       infoWindowIsShow = true; 
       lastMarker = marker; 
      } else { 
       marker.showInfoWindow(); 
       infoWindowIsShow = true; 
       lastMarker = marker; 
      } 
     } 
     return true; 
    } 
} 

mMap.setOnMarkerClickListener (nuova MarkerClickListener());

0

Secondo la documentazione si è corretto:

Una finestra di informazioni consente di visualizzare informazioni all'utente quando toccare su un marcatore. Viene visualizzata una sola finestra informativa alla volta. Se un utente di fa clic su un altro indicatore, la finestra di informazioni corrente verrà nascosta e verrà visualizzata la nuova finestra di informazioni.

Possiamo considerarlo come un errore dal punto di vista dell'utilizzo.

@Override 
public boolean onMarkerClick(Marker marker) 

Da logica di business questo non è il posto giusto per chiamare marker.isInfoWindowShown() funzione perché è sempre falso, come dovrebbe essere. Quando OnMarkerClickListener chiama questa funzione, qualsiasi open InfoWindow è già stato nascosto da Map framework stesso (quindi lo stato 'false' tecnicamente è corretto).

È possibile controllare che esempio delle modifiche sovrascritta onMarkerClick metodo aprire InfoWindows solo su anche cliks. Su clik dispari - non fare nulla e vedere InfoWindows si chiude automaticamente dal framework senza chiamata esplicita a marker.hideInfoWindow();

Per ottenere lo stato InfoWindow effettivo, è necessario chiamare marker.isInfoWindowShown da altri eventi o funzioni mantenendo i riferimenti locali su qualsiasi indicatore sulla mappa.

+0

Quando questo metodo suMarkerClick viene chiamato, il marker.isInfoWindowShown viene chiamato su un particolare indicatore e quindi di conseguenza lo stato di InfoWindow deve essere assegnato a quell'indicatore stesso. Quindi, come lo stato 'falso' è tecnicamente corretto non sono in grado di capire. Anche se la gestione suInfoWindowClick risolve questo problema, ciò rimane irrisolto perchéInfoWindowShown restituisce sempre false. – user2779311

+0

Poiché la struttura della mappa ha già chiuso InfoWindow prima di chiamare il metodo onMarkerClick. – Arvis

+0

è per questo che isInfoWindowShown restituisce sempre false – user2779311

0

isInfoWindowShown sempre falso, così ho finestra di informazioni nascondo utilizzando il modo di base

int mLastIndex = -1 

e

@Override 
public boolean onMarkerClick(Marker marker) { 
    int index = (int) marker.getTag(); 
    Log.i(TAG, "onMarkerClick: " + index); 
    if(lastIndex != index){ 
     marker.showInfoWindow(); 
     lastIndex = index; 
    }else{ 
     marker.hideInfoWindow(); 
     lastIndex = -1; 
    } 

    return true; 
} 
0

Nel mio caso sto mostrando il mio informazioni finestra su google informazioni finestra,

My window info

E avevo bisogno di nascondere google w Indow info ogni volta che l'utente fa clic su un altro posto, ad esempio mappa, pulsanti.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    Marker lastMarkerClicked = modelManager.getLastMarkerClicked(); 
    if(lastMarkerClicked!=null){ 
     lastMarkerClicked.hideInfoWindow(); 
    } 
    super.onWindowFocusChanged(hasFocus); 
} 

Ma ho anche bisogno di Googles informazioni finestra perché una delle mie caratteristiche è quello di condividere screenshot della mappa, e ci Finestra informazioni è necessario per la funzione screenshot.

(Per questo lavoro la finestra a comparsa dovrebbe perdere la concentrazione Così la sua proprietà attivabile dovrebbe essere impostata su true)

0

Ho avuto lo stesso problema e ho trovato una soluzione semplice dichiarando una variabile booleana globale e la commutazione il suo valore quando l'utente fa clic su un indicatore. Ecco il mio codice:

private boolean isInfoWindowShown = false; 

    map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
     @Override 
     public boolean onMarkerClick(Marker marker) { 

      if (!isInfoWindowShown) { 

       marker.showInfoWindow(); 
       map.moveCamera(CameraUpdateFactory.newLatLng(marker.getPosition())); 
       isInfoWindowShown = true; 
      } else { 

       marker.hideInfoWindow(); 
       isInfoWindowShown = false; 
      } 

      return true; 
     } 
    }); 

Spero che questo aiuti qualcuno.

Problemi correlati