Ti sto dicendo che ora è un trucco, quindi non c'è motivo di downvote per questo motivo. Significa che ti sarà utile in modo specifico o no. In ogni caso, la descrizione di seguito fornirà alcune informazioni e sarà utile alla comunità. Inoltre, questa soluzione è utile per le API meno recenti che non hanno ViewPager.getCurrentItem()
.
Innanzitutto, una piccola informazione. Se iterate attraverso tutti i figli di un ViewPager ViewPager.getChildAt(x);
e stampate con toString()
(o getLeft()
) ogni vista figlia (una pagina) e poi lo fate ogni volta che cambiate pagina, noterete che i figli non saranno nell'ordine logico in cui sono in quando inizi a tornare alle pagine (paging indietro all'inizio). Apparentemente, rimuoverà il figlio non necessario dall'array, quindi aggiungerà il figlio più recente all'array. Quindi, ad esempio, diciamo che stai guardando la pagina 2 e poi cambiato a pagina 3, il tuo elenco di bambini sarà in questo ordine non restituisce la pagina corrente. Non sono ancora riuscito a trovare una logica semplice per eliminare la pagina corrente utilizzando queste informazioni. Perché l'ordine delle pagine nella matrice dietropage 2, page 3, page 4
il che significa che ViewPager.getChildAt(1);
restituirà la pagina corrente. Ma se poi torni a pagina 2 (da pagina 3) il tuo elenco di bambini sarà in questo ordine, il page 2, page 3, page 1
che significa cheViewPager.getChildAt(1);
getChildAt
è in un ordine arbitrario basato sul modo in cui l'utente ha sfogliato.
Detto questo, ho sviluppato una soluzione per hackerare. Non ho idea se questa funzione funzionerà in tutti gli ambienti, ma funziona per il mio progetto attuale. Sospetto che se non lo fai per te, allora è un problema di diverso livello API. Ma in realtà non sospetto alcun problema per altri ambienti.
Ora passiamo alla carne. Quello che ho notato è che il risultato di ViewPager.getChildAt(x).getLeft()
avrà un qualche tipo di coordinata pixel orizzontale rispetto al genitore. Quindi, ho usato queste informazioni per eliminare quale vista è quella corrente.
private int getCurrentPageIndex(ViewPager vp){
int first,second,id1,id2,left;
id1 = first = second = 99999999;
View v;
for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
left = vp.getChildAt(i).getLeft();
if ( left < second ) {
if ( left < first ) {
second = first;
id2 = id1;
first = left;
id1 = i;
} else {
second = left;
id2 = i;
}
}
}
return id2;
}
Questa funzione è probabilmente un hack discutibile perché si basa sul valore di getLeft()
per capire tutto. Ma prendo la coordinata sinistra di ogni bambino. Quindi confronto questo con gli altri valori e memorizzo la prima e la seconda pagina, restituendo la seconda pagina (pagina corrente) fuori dalla funzione. Sembra funzionare magnificamente.
Perché (potresti chiedere) non ho semplicemente usato onClickListenter
o qualsiasi altra soluzione? Bene, ero dannatamente determinato che ci fosse un modo semplice per farlo senza dover includere ascoltatori, altre classi, concentrazione inconcludente e altro gonfio. Sfortunatamente, questa soluzione non è esattamente semplice. Ma elimina il gonfio, le altre classi e gli ascoltatori. Se riesco a trovare un modo più diretto, riscriverò questa funzione. O forse, questo fornirà informazioni a qualcun altro per avere un'illuminazione.