Ich sage Ihnen jetzt, es ist ein Hack, also gibt es keinen Grund, aus diesem Grund abzustimmen. Das heißt, es wird entweder speziell für Sie hilfreich sein oder nicht. In beiden Fällen bietet die folgende Beschreibung einen Einblick und ist für die Community hilfreich. Diese Lösung eignet sich auch für ältere APIs, die keine haben ViewPager.getCurrentItem()
.
Zunächst ein paar Informationen. Wenn Sie alle untergeordneten Elemente eines ViewPagers mit jeder untergeordneten Ansicht (einer Seite) durchlaufen ViewPager.getChildAt(x);
und mit toString()
(oder getLeft()
) jeder untergeordneten Ansicht (einer Seite) ausdrucken und dies dann bei jedem Seitenwechsel tun, werden Sie feststellen, dass die untergeordneten Elemente nicht in der logischen Reihenfolge angezeigt werden, in der sie angezeigt werden in, wenn Sie anfangen, Seiten zurück zu blättern (Paging zurück zum Anfang). Anscheinend wird das nicht benötigte Kind aus dem Array entfernt und dann das neueste Kind an das Array angehängt. Nehmen wir zum Beispiel an, Sie sehen sich Seite 2 an und wechseln dann zu Seite 3. Ihre Liste der Kinder befindet sich in dieser Reihenfolge, page 2, page 3, page 4
was bedeutet, dass ViewPager.getChildAt(1);
die aktuelle Seite zurückgegeben wird. Wenn Sie dann jedoch zu Seite 2 (von Seite 3) zurückkehren, wird Ihre Liste der Kinder in dieser Reihenfolge page 2, page 3, page 1
angezeigt, was bedeutet, dassViewPager.getChildAt(1);
gibt die aktuelle Seite nicht zurück. Ich konnte noch keine einfache Logik finden, um die aktuelle Seite anhand dieser Informationen auszusortieren. Weil die Reihenfolge der Seiten im Array dahinter getChildAt
in einer beliebigen Reihenfolge liegt, die davon abhängt, wie der Benutzer herumgespielt hat.
Davon abgesehen habe ich einen Hack-Workaround entwickelt. Ich habe keine Ahnung, ob diese Funktion in allen Umgebungen funktioniert, aber sie funktioniert für mein aktuelles Projekt. Ich würde vermuten, wenn nicht für Sie, dann ist es ein Problem der verschiedenen API-Ebene. Aber ich vermute eigentlich keine Probleme für andere Umgebungen.
Nun zum Fleisch. Was mir aufgefallen ist, dass das Ergebnis von ViewPager.getChildAt(x).getLeft()
eine Art horizontale Pixelkoordinate relativ zum übergeordneten Element hat. Also habe ich diese Informationen verwendet, um herauszufinden, welche Ansicht die aktuelle ist.
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;
}
Diese Funktion ist wahrscheinlich ein fragwürdiger Hack, da sie sich auf den Wert von stützt getLeft()
, um alles herauszufinden. Aber ich greife nach der linken Koordinate jedes Kindes. Ich vergleiche dies dann mit den anderen Werten und speichere die erste und zweite Seite, wobei die zweite Seite (aktuelle Seite) aus der Funktion zurückgegeben wird. Es scheint wunderbar zu funktionieren.
Warum (könnten Sie fragen) habe ich nicht einfach eine onClickListenter
andere Lösung verwendet? Nun, ich war verdammt entschlossen, dass es einen direkten Weg gab, dies zu tun, ohne Zuhörer, andere Klassen, nicht schlüssigen Fokus und andere Aufblähungen einbeziehen zu müssen. Leider ist diese Lösung nicht gerade einfach. Aber es beseitigt das Aufblähen, andere Klassen und Zuhörer. Wenn ich einen einfacheren Weg finden kann, werde ich diese Funktion neu schreiben. Oder vielleicht bietet dies jemand anderem die Möglichkeit, eine Offenbarung zu haben.