Te digo que ahora es un truco, por lo que no hay razón para rechazar por ese motivo. Es decir, le será útil específicamente o no. De cualquier manera, la descripción a continuación proporcionará información y será útil para la comunidad. Además, esta solución es buena para las API más antiguas que no tienen ViewPager.getCurrentItem()
.
Primero, un poco de información. Si itera a través de todos los elementos secundarios de un ViewPager con ViewPager.getChildAt(x);
e imprime con toString()
(o getLeft()
) cada Vista secundaria (una página) y luego hace esto cada vez que cambia de página, notará que los elementos secundarios no estarán en el orden lógico en el que se muestran. cuando empiece a retroceder páginas (regresando al principio). Aparentemente, eliminará el hijo innecesario de la matriz y luego agregará el hijo más nuevo a la matriz. Entonces, por ejemplo, digamos que está viendo la página 2 y luego cambiado a la página 3, su lista de niños estará en este orden, page 2, page 3, page 4
lo que significa que ViewPager.getChildAt(1);
devolverá la página actual. Pero, si luego vuelve a la página 2 (desde la página 3), su lista de niños estará en este orden, lo page 2, page 3, page 1
que significa queViewPager.getChildAt(1);
no devuelve la página actual. Todavía no he podido encontrar una lógica simple para eliminar la página actual usando esta información. Porque el orden de las páginas en la matriz de detrás getChildAt
está en un orden arbitrario basado en cómo el usuario ha estado navegando.
Dicho esto, desarrollé una solución alternativa para hackear. No tengo ni idea de si esta función funcionará en todos los entornos, pero funciona para mi proyecto actual. Sospecho que si no es para usted, entonces es un problema de nivel de API diferente. Pero en realidad no sospecho ningún problema para otros entornos.
Ahora, sobre la carne. Lo que noté fue que el resultado de ViewPager.getChildAt(x).getLeft()
tendrá algún tipo de coordenada de píxel horizontal en relación con el padre. Entonces, usé esta información para descartar qué vista es la actual.
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;
}
Esta función es probablemente un truco cuestionable porque se basa en el valor de getLeft()
para resolverlo todo. Pero, tomo la coordenada izquierda de cada niño. Luego comparo esto con los otros valores y almaceno la primera y segunda página, devolviendo la segunda página (página actual) fuera de la función. Parece funcionar maravillosamente.
¿Por qué (podrías preguntar) no usé simplemente onClickListenter
o cualquier solución? Bueno, estaba condenado a la determinación de que había una manera sencilla de hacer esto sin tener que incluir a los oyentes, otras clases, un enfoque inconcluso y otros problemas. Desafortunadamente, esta solución no es exactamente sencilla. Pero, elimina la hinchazón, otras clases y oyentes. Si puedo encontrar una forma más sencilla, reescribiré esta función. O tal vez, esto proporcionará información para que otra persona tenga una epifanía.