Sto utilizzando un GoogleMap (v2 api) all'interno di un frammento all'interno di un ViewPager. Il problema originale che stavo facendo era che il ViewPager stava acquisendo tutti i movimenti di scorrimento orizzontali in modo che la mappa potesse essere trascinata solo se l'utente iniziava in direzione verticale o diagonale. Tutto il trascinamento orizzontale è stato catturato dallo ViewPager
. Ho trovato che la soluzione è creare una classe derivata ViewPager
e sovrascrivere il metodo canScroll
. La vista trascinata viene passata a questo metodo, quindi puoi prendere una decisione in base al tipo di visualizzazione.Personalizza ViewPager per consentire al controllo GoogleMap figlio di scorrere orizzontalmente
Nel mio caso, il mio frammento è un SupportMapFragment
(dal pacchetto com.google.android.gms.maps
) che mi fornisce un oggetto GoogleMap con cui interagire. Tuttavia, il controllo effettivo che ricevo nel metodo canScroll
di ViewPager è di tipo maps.j.b
. Ho risolto il problema con il seguente codice all'interno della mia classe ViewPager personalizzata. Tuttavia, non mi sento a mio agio nel controllare questo nome di classe quando non ne so nulla. Che cos'è maps.j.b? È una classe creata dinamicamente in fase di runtime? È possibile che il tipo cambi in un futuro aggiornamento del framework? Dato solo l'oggetto View, c'è un modo più robusto per verificare che il trascinamento sia stato avviato da un controllo mappa?
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if(v.getClass().getName().equals("maps.j.b")) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
È probabile che si tratti di un output ProGuard poiché i campi di istanza di runtime sono anche tutti nomi di singoli caratteri. Il tipo che ottengo in fase di esecuzione non è disponibile per me in fase di compilazione, quindi non so se sarò in grado di fare qualsiasi cosa con instanceof. E considerando che il nome del tipo che sto usando oggi dipende dalla versione della libreria che sto usando, immagino di poterlo inserire in un test unitario per verificare le modifiche. Continuerò a controllare l'oggetto ed è classe in fase di esecuzione e vedere se riesco a trovare qualcosa di più stabile. Come sempre, grazie per il vostro aiuto e input. – Rich
@Rich: "Il tipo che ottengo al runtime non è disponibile per me in fase di compilazione" - no, ma 'instanceof' funzionerà ancora. Hai solo bisogno di determinare se è un 'MapView' o qualche sottoclasse, e' instanceof' cammina la catena di ereditarietà. – CommonsWare
Esiste un modo per esaminare la catena di ereditarietà in fase di esecuzione (ad esempio, in qualcosa come la finestra Espressioni in Eclipse)?Inoltre, ho pensato ad un approccio ancora più semplice che funzioni poiché la mia mappa riempie tutto lo spazio disponibile. Poiché l'adattatore che alimenta ViewPager dichiara esplicitamente quale frammento va in quale posizione, posso anche controllare la posizione e il vCheck booleano che dovrebbe significare che sono nella foglia della gerarchia della vista (non ci sono più bambini da controllare). Ho appena testato quel metodo e funziona così lontano. – Rich