Je vous le dis maintenant, c'est un hack, donc il n'y a aucune raison de décoter pour cette raison. En d'autres termes, soit il vous sera utile, soit il ne le sera pas. Dans tous les cas, la description ci-dessous fournira un aperçu et sera utile à la communauté. En outre, cette solution est bonne pour les anciennes API qui n'ont pas de fonction ViewPager.getCurrentItem()
.
Tout d'abord, une petite information. Si vous parcourez tous les enfants d'un ViewPager à l'aide de la fonction ViewPager.getChildAt(x);
et l'imprimer avec toString()
(ou getLeft()
) chaque vue enfant (une page) et faire cela chaque fois que vous changez de page, vous remarquerez que les enfants ne seront pas dans l'ordre logique dans lequel ils sont affichés lorsque vous commencez à remonter les pages (pagination vers le début). Apparemment, le système supprime l'enfant inutile du tableau, puis ajoute l'enfant le plus récent au tableau. Ainsi, par exemple, si vous regardez la page 2 puis passez à la page 3, votre liste d'enfants sera dans l'ordre suivant page 2, page 3, page 4
ce qui signifie que ViewPager.getChildAt(1);
retournera la page actuelle. Mais, si vous revenez ensuite à la page 2 (à partir de la page 3), votre liste d'enfants sera dans cet ordre page 2, page 3, page 1
ce qui signifie que ViewPager.getChildAt(1);
ne renvoie pas la page actuelle. Je n'ai pas encore réussi à trouver une logique simple permettant d'extraire la page actuelle à l'aide de cette information. Parce que l'ordre des pages dans le tableau derrière getChildAt
est dans un ordre arbitraire basé sur la façon dont l'utilisateur a paginé.
Ceci étant dit, j'ai développé une solution de contournement. Je n'ai aucune idée si cette fonction fonctionnera dans tous les environnements, mais elle fonctionne pour mon projet actuel. Je soupçonne que si ce n'est pas le cas pour vous, c'est un problème de niveau d'API différent. Mais je ne soupçonne pas de problèmes pour d'autres environnements.
Maintenant, la viande. Ce que j'ai remarqué, c'est que le résultat ViewPager.getChildAt(x).getLeft()
aura un certain type de coordonnées horizontales en pixels par rapport au parent. J'ai donc utilisé cette information pour déterminer quelle vue est la vue actuelle.
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;
}
Cette fonction est probablement un hack discutable car elle repose sur la valeur de getLeft()
pour comprendre tout ça. Mais, je prends la coordonnée gauche de chaque enfant. Je la compare ensuite aux autres valeurs et je stocke la première et la deuxième page, renvoyant la deuxième page (page actuelle) hors de la fonction. Cela semble fonctionner à merveille.
Pourquoi (me demanderez-vous) n'ai-je pas simplement utilisé onClickListenter
ou toute autre solution ? Eh bien, j'étais bien décidé à trouver un moyen direct de le faire sans avoir à inclure des écouteurs, d'autres classes, une mise au point peu concluante et d'autres éléments inutiles. Malheureusement, cette solution n'est pas vraiment directe. Mais elle permet de se débarrasser des éléments superflus, des autres classes et des listeners. Si je peux trouver un moyen plus direct, je réécrirai cette fonction. Ou peut-être, cela fournira un aperçu pour quelqu'un d'autre d'avoir une épiphanie.