it-swarm.com.ru

Вызов ViewPager setUserVisibleHint после загрузки первого фрагмента

В моем приложении у меня есть ViewPager, который содержит множество перелистываемых вкладок с фрагментами внутри. Я использую метод setUserVisibleHint, чтобы определить, когда Fragment появляется на экране. Это прекрасно работает, когда пользователь перемещается между вкладками, но не работает при первой загрузке. Чтобы запустить код в методе, мне нужно провести пальцем влево, а затем вернуться к первому Fragment, потому что метод setUserVisibleHint вызывается перед методом onCreateView

У вас есть идеи, как я могу запустить этот код после того, как первый фрагмент виден? Есть ли метод в ViewPager или что-то еще?

39
Cilenco

Вы не можете (и не должны) полагаться на setUserVisibleHint для этого. Вместо этого вы должны использовать ViewPager.OnPageChangeListener для получения обратных вызовов, когда страница становится видимой. Например.

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});

Примечание: Вы можете использовать ViewPager.SimpleOnPageChangeListener, если вам не нужно прослушивать все обратные вызовы.

Обновление

Метод setOnPageChangeListener устарел, вместо него используйте addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});
58
Paul Burke

НИЖЕ РАБОТАЛ ДЛЯ МЕНЯ

Пожалуйста, создайте глобальное представление, как это

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)
                {
                   onResume();
                }

        }

и в методе OnResume 

@Override
         public void onResume() { 
         super.onResume();   
            if (!getUserVisibleHint()) {
            return;
          }
      //do your stuff here
   }
4
Rahul

Вы должны вручную вызвать mViewPagerListener.onPageSelected(0); в onCreateView в своей корневой деятельности/фрагменте.

3
Yuraj

Я не совсем понимаю, что вам нужно, но вы можете определить страницу текущего фрагмента, вызвав ViewPager.getCurrentItem, который возвращает целое число.

Надеюсь, поможет.

Удачи.

0
Emre Aktürk

Ну, его обходной путь больше, и, возможно, лучше настроить 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;

Может быть, кто-то найдет это полезным. Это работает для меня.

0
kara4k