Я говорю вам, что это взлом, так что нет причин понижать голос по этой причине. То есть будет либо полезно конкретно вам, либо нет. В любом случае приведенное ниже описание даст некоторое представление и будет полезно сообществу. Кроме того, это решение подходит для старых API, которых нет ViewPager.getCurrentItem()
.
Для начала немного информации. Если вы перебираете всех дочерних элементов ViewPager ViewPager.getChildAt(x);
и распечатываете с toString()
(или getLeft()
) каждым дочерним View (страницей), а затем делаете это каждый раз, когда вы меняете страницы, вы заметите, что дочерние элементы не будут находиться в том логическом порядке, в котором они отображаются в, когда вы начинаете переходить на предыдущие страницы (перелистывание назад к началу). Очевидно, он удалит ненужный дочерний элемент из массива, а затем добавит в массив самый новый дочерний элемент. Так, например, предположим, что вы смотрите на страницу 2, а затем переходите на страницу 3, ваш список дочерних элементов будет в этом порядке, page 2, page 3, page 4
что означает, что ViewPager.getChildAt(1);
будет возвращена текущая страница. Но если вы затем вернетесь на страницу 2 (со страницы 3), ваш список детей будет в таком порядке, page 2, page 3, page 1
что означает, чтоViewPager.getChildAt(1);
, не возвращает текущую страницу. Я еще не смог найти простой логики, чтобы отсеять текущую страницу, используя эту информацию. Поскольку порядок страниц в массиве позадиgetChildAt
находится в произвольном порядке в зависимости от того, как пользователь просматривал страницы.
При этом я разработал обходной путь. Я понятия не имею, будет ли эта функция работать во всех средах, но она работает для моего текущего проекта. Я подозреваю, что если не для вас, то это проблема другого уровня API. Но на самом деле я не подозреваю о каких-либо проблемах с другими средами.
Теперь перейдем к мясу. Я заметил, что результат ViewPager.getChildAt(x).getLeft()
будет иметь какую-то горизонтальную координату пикселя относительно родителя. Итак, я использовал эту информацию, чтобы отсеять, какое представление является текущим.
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()
чтобы во всем разобраться. Но я беру левую координату каждого ребенка. Затем я сравниваю это с другими значениями и сохраняю первую и вторую страницы, возвращая вторую страницу (текущую страницу) из функции. Вроде красиво работает.
Почему (вы можете спросить) я просто не использовал onClickListenter
или какое-то другое решение? Что ж, я был чертовски уверен, что есть простой способ сделать это без необходимости включать слушателей, другие классы, неубедительную фокусировку и другие раздувания. К сожалению, это решение не совсем простое. Но это избавляет от раздувания, других классов и слушателей. Если я смогу найти более простой способ, я перепишу эту функцию. Или, может быть, это даст возможность кому-то еще увидеть прозрение.