ハックだと言っているので、その理由で反対票を投じる理由はありません。つまり、具体的に役立つかどうかのどちらかです。いずれにせよ、以下の説明は洞察を提供し、コミュニティに役立ちます。また、このソリューションは、 を持たない古い API にも適していますViewPager.getCurrentItem()
。
まず、ちょっとした情報。ViewPager のすべての子を反復処理し、各子 View (ページ) を使用しViewPager.getChildAt(x);
て印刷toString()
(またはgetLeft()
) し、ページを変更するたびにこれを行うと、子が表示される論理的な順序にならないことに気付くでしょう。ページを戻し始めるとき(ページを最初に戻す)。どうやら、不要な子を配列から削除してから、最新の子を配列に追加します。したがって、たとえば、ページ 2 を表示してからページ 3 に変更すると、子のリストはこの順序になり、現在のページが返されることをpage 2, page 3, page 4
意味します。ViewPager.getChildAt(1);
しかし、その後 (3 ページから) 2 ページに戻ると、子のリストはこの順序になりますpage 2, page 3, page 1
。つまり、ViewPager.getChildAt(1);
現在のページを返しません。この情報を使用して現在のページを除外する単純なロジックをまだ見つけることができませんでした。背後にある配列内のページの順序はgetChildAt
、ユーザーがどのようにページングしてきたかに基づいて任意の順序になっているためです。
そうは言っても、私はハックの回避策を開発しました。この機能がすべての環境で機能するかどうかはわかりませんが、現在のプロジェクトでは機能します。もしそうでないなら、それは別のAPIレベルの問題だと思います。しかし、実際には他の環境の問題を疑っていません。
では、お肉へ。私が気づいたのは、ViewPager.getChildAt(x).getLeft()
will の結果が、親に対して何らかのタイプの水平ピクセル座標を持つことです。そこで、この情報を使用して、現在のビューを除外しました。
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;
}
getLeft()
この関数は、すべてを把握するために の値に依存しているため、おそらく疑わしいハックです。ただし、各子の左座標を取得します。次に、これを他の値と比較し、最初と 2 番目のページを保存して、関数から 2 番目のページ (現在のページ) を返します。それは美しく働くようです。
なぜ(あなたが尋ねるかもしれませんが)私はただ使用しなかったのonClickListenter
ですか?ええと、リスナー、他のクラス、決定的な焦点、および他の肥大化を含める必要なしに、これを行うための簡単な方法があると決心しました。残念ながら、この解決策は単純ではありません。ただし、肥大化、他のクラス、およびリスナーを排除します。より簡単な方法を見つけることができれば、この関数を書き直します。あるいは、これは他の誰かがひらめきを持つための洞察を提供するかもしれません.