Estou dizendo que agora é um hack, então não há razão para downvote por esse motivo. Ou seja, será útil para você especificamente ou não. De qualquer forma, a descrição abaixo fornecerá alguns insights e será útil para a comunidade. Além disso, essa solução é boa para APIs mais antigas que não têm ViewPager.getCurrentItem()
.
Primeiro, algumas informações. Se você iterar através de todos os filhos de um ViewPager com ViewPager.getChildAt(x);
e imprimir com toString()
(ou getLeft()
) cada Visualização filho (uma página) e, em seguida, fazer isso toda vez que mudar de página, você notará que os filhos não estarão na ordem lógica em que são exibidos quando você começa a voltar às páginas (voltar ao início). Aparentemente, ele removerá o filho desnecessário do array e, em seguida, acrescentará o filho mais novo ao array. Então, por exemplo, digamos que você está olhando a página 2 e depois mudou para a página 3, sua lista de filhos estará nesta ordem em uma ordem arbitrária com base em como o usuário está navegando.page 2, page 3, page 4
o que significa que ViewPager.getChildAt(1);
retornará a página atual. Mas, se você voltar para a página 2 (da página 3), sua lista de crianças estará nesta ordem, o page 2, page 3, page 1
que significa queViewPager.getChildAt(1);
não retorna a página atual. Ainda não consegui encontrar uma lógica simples para eliminar a página atual usando essas informações. Porque a ordem das páginas na matriz posterior as páginasgetChildAt
Dito isso, desenvolvi uma solução alternativa para o hack. Não tenho ideia se esta função funcionará em todos os ambientes, mas funciona para meu projeto atual. Eu suspeitaria se não fosse para você, então é um problema de nível de API diferente. Mas eu realmente não suspeito de quaisquer problemas para outros ambientes.
Agora, para a carne. O que percebi é que o resultado de ViewPager.getChildAt(x).getLeft()
terá algum tipo de coordenada de pixel horizontal em relação ao pai. Portanto, usei essas informações para descartar qual visualização é a atual.
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 função é provavelmente um hack questionável porque depende do valor de getLeft()
para descobrir tudo. Mas, eu pego a coordenada esquerda de cada criança. Em seguida, comparo isso com os outros valores e armazeno a primeira e a segunda páginas, retornando a segunda página (página atual) fora da função. Parece funcionar lindamente.
Por que (você pode perguntar) eu simplesmente não usei onClickListenter
ou qualquer outra solução? Bem, eu estava determinado que havia uma maneira direta de fazer isso sem ter que incluir ouvintes, outras classes, foco inconclusivo e outros inchaços. Infelizmente, essa solução não é exatamente direta. Mas, ele acaba com o inchaço, outras classes e ouvintes. Se eu conseguir descobrir uma maneira mais direta, estarei reescrevendo esta função. Ou talvez, isso proporcionará uma visão para outra pessoa ter uma epifania.