ViewPager call setUserVisibleHint after first Fragment is loaded

后端 未结 6 1407
梦谈多话
梦谈多话 2020-12-13 23:40

In my application, I have a ViewPager which holds many swipeable Tabs with Fragments inside. I use the setUserVisibleHint method to detect when a Fragment

相关标签:
6条回答
  • 2020-12-14 00:06

    You have to call manually mViewPagerListener.onPageSelected(0); in onCreateView in your root activity/fragment.

    0 讨论(0)
  • 2020-12-14 00:13

    I check your problem,but I find out the onCreateView method is called before the setUserVisibleHint method

    enter code here
    

    because the setUserVisibleHint method is called before the onCreateView method

    0 讨论(0)
  • 2020-12-14 00:15

    I dont understand what you need exactly but you can detect the page of the current fragment by calling ViewPager.getCurrentItem that return integer.

    Hope it helps.

    Good luck.

    0 讨论(0)
  • 2020-12-14 00:17

    BELOW WORKED FOR ME

    Please create a global view like this

    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;
        }
    

    and use this

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

    and In OnResume method

    @Override
             public void onResume() { 
             super.onResume();   
                if (!getUserVisibleHint()) {
                return;
              }
          //do your stuff here
       }
    
    0 讨论(0)
  • 2020-12-14 00:32

    Well, its workaround more, and maybe its better to setup OnPageChangeListener, but it works for me. The task is to determine whether the current fragment is visible at creation. You can use the menu to do this. In your fragment:

     @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setHasOptionsMenu(true); // set current fragment has its own options menu
        } 
    

    and this

     @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;
    

    Maybe someone will find it usefull. This works for me.

    0 讨论(0)
  • 2020-12-14 00:33

    You can't (and shouldn't) rely on setUserVisibleHint for this. Instead, you should be using a ViewPager.OnPageChangeListener to get callbacks for when a page becomes visible. E.g.

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

    Note: You can use ViewPager.SimpleOnPageChangeListener if you don't need to listen for all callbacks.

    Update

    setOnPageChangeListener method is now deprecated, use addOnPageChangeListener instead

    viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            // do your work
        } 
    });
    
    0 讨论(0)
提交回复
热议问题