ViewPager call setUserVisibleHint после загрузки первого фрагмента
В моем приложении у меня есть ViewPager, который содержит много прокручиваемых вкладок с фрагментами внутри. Я использую метод setUserVisibleHint
для обнаружения, когда на экран появляется Fragment
. Это отлично работает, когда пользователь щелкает между вкладками, но он не работает при первом загрузке. Чтобы запустить код в методе, я должен прокрутить влево, а затем вернуться к первому Fragment
, потому что метод setUserVisibleHint
вызывается перед методом onCreateView
.
У вас есть идеи, как я могу запустить этот код после того, как первый фрагмент будет виден? Есть ли метод в ViewPager
или что-то еще?
Ответы
Ответ 1
Вы не можете (и не должны) полагаться на setUserVisibleHint
для этого. Вместо этого вы должны использовать ViewPager.OnPageChangeListener для получения обратных вызовов, когда страница станет видимой. Например.
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// do your work
}
});
Примечание. Вы можете использовать ViewPager.SimpleOnPageChangeListener
, если вам не нужно прослушивать все обратные вызовы.
Update
setOnPageChangeListener
теперь устарел, используйте addOnPageChangeListener
вместо
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// do your work
}
});
Ответ 2
НИЖЕ РАБОТАЕМ ДЛЯ МЕНЯ
Создайте глобальное представление, подобное этому
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
//inflate view layout
view =inflater.inflate(R.layout.your_fragment, container, false);
// return view
return view;
}
и используйте этот
@Override
public void setUserVisibleHint(boolean isUserVisible)
{
super.setUserVisibleHint(isUserVisible);
// when fragment visible to user and view is not null then enter here.
if (isUserVisible && view != null)
{
// do your stuff here.
}
}
Ответ 3
Вы должны вручную вызвать mViewPagerListener.onPageSelected(0);
в onCreateView
в корневой активности/фрагменте.
Ответ 4
Я не понимаю, что вам нужно точно, но вы можете обнаружить страницу текущего фрагмента, вызвав ViewPager.getCurrentItem
, которые возвращают целое число.
Надеюсь, что это поможет.
Удачи.
Ответ 5
Ну, его обходной путь больше, и, возможно, его лучше настроить OnPageChangeListener
, но он работает для меня. Задача состоит в том, чтобы определить, является ли текущий фрагмент видимым при создании. Вы можете использовать это меню для этого. В вашем фрагменте:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true); // set current fragment has its own options menu
}
и этот
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
...
if(isMenuVisible()) { // menu should be visible if current fragment is visible right now
setUserVisibleHint(true); // manually set value to true
}
...
return view;
Может быть, кто-то найдет это полезным. Это работает для меня.
Ответ 6
Я проверяю вашу проблему, но я узнаю, что метод onCreateView
вызывается до
setUserVisibleHint
метод
enter code here
потому что метод setUserVisibleHint вызывается перед методом onCreateView