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