I implemented View Pager with fragment child A/B/C. To get selection of default Fragment(say A) I use mViewPager.setCurrentItem(position) and it work fine. But on this Second Fragment (B) view methods onViewCreated and setUserVisibleHint calling automatically.
Is there any way to prevent this !
You can try invoking ViewPager.setOffscreenPageLimit(0), which will no longer pre-load non-visible Fragments. The default value for the off-screen page limit is 1, so that should be the reason why the onViewCreated() and setUserVisibleHint() methods are being called for your other fragments.
Related
I use Viewpager2 With setup tablayout using TabLayoutMediator but the issue is
when I swipe viewpager first fragment to the second fragment here only call
current fragment's lifecycle methods, but when I click on tablayout
then call next fragment's lifecycle methods. I don't know why this happens?
This happens because the method that TabLayoutMediator uses to move to the selected fragment causes the RecyclerView to cache the next Fragment as it uses Smooth Scrolling.
This should not be a problem UNLESS you are doing something in the wrong part of the Fragment's lifecycle. If you only want do something when a Fragment is displayed then only do it in the Fragments onResume method as the behaviour you describe will only take the cached Fragment to "Started" state.
I am using 4 fragments in MainActivity with viewPager where viewPager is not scrollable, and I have four more fragments inside Second Fragment of MainActivity fragment. I am calling API in my all fragments in the onCreateView method. But when activity initialized so all fragments onCreateView method run, how to fix it because I want when the fragment is visible than my API call.
I already tried setUserVisibleHint method it's also working when activity initialized.
Should I use frame layout or anything else to fix this problem?
if i understood you good then you want to call your api when fragments are visible.
if yes then use
viewPager.addOnPageChangeListener
and onPageSelected(int position) callback then just make good condition which call you'r api
edit: changed adapter to viewPager
I think you need to put your api calls method in onResume in each fragment that will be fired when your fragment is on the top of fragments stack (Shown).
I have a ViewPager which contain 2 tabs(2 Separate fragments).
My Second Tab consist of further 6 child tabs (each separate fragment) in another ViewPager.
Now When i switch between 6 child tabs, setUserVisibleHint() method is called.
But when i am present on my any of 6 child tabs(i.e fragment) and i try to switch between the 2 parent tabs. None of the methods like onPause(), onStop(), setUserVisibleHint(), and onHiddenChange() of child tab fragment do not get called.
So can you please help me to know which method will get called of child fragment when i switch between 2 parent tabs?
And if no methods will get called of child fragments, then how can i achieve or know that there is switch between parent tabs and call a method in child fragments?
You shouldn't rely on a fragment lifecycle in this case. It's controlled by adapter and if any of those callbacks gets called it doesn't guarantee you anything.
Use onPageChangeListener instead. You can set it on a ViewPager object via addOnPageChangeListener in onResume for example, and call removeOnPageChangeListener in onPause. It has a method onPageChanged which will be called every time you switch the page.
I'm using a ViewPager in my app. There are three fragments inside the PageAdapter that is set in the ViewPager. All works perfectly fine and I can switch between all three fragments. I have 3 buttons that allow me to switch between adapters 1 to 3. The problem is noticed when I click buttons 1 and 3 at the same time. Here's what happens:
Fragment 1 - Fragment 3
onAttach
onViewCreated
onResume
onPause
onAttach
onViewCreated
onResume
onPause
As you can see from above, the second fragment is never paused and therefore never resumed. Both fragments modify the same recycler view onResume so with the behaviour above I end up with the incorrect state of my recycler view.
Any thoughts on why this might be happening and how I can fix this?
A ViewPager loads (by default) the current page, the previous page and the next page, since you have only 3 pages the second fragment is always resumed.
the solution is to set up a OnPageChangeListener and modify the recycler view in onPageSelected instead in onResume
I have a action bar with 3 navigation tabs: Fragment 1, Fragment 2 and Fragment 3. Now, I want to do a task whenever Fragment 3 selected, so I put my task code in onCreateView() method. However, I find that Fragment 3 does not do the task, it means the onCreateView() method is not called. (I check this by logging). The other strange things is:
- When I slide: F2-> F3: the task not work.
- When I slide: F1->F2->F3: the task work. (onCreateView() method called)
I don't know why F3's onCreateView() method called when I slide from F1 to F3?
Any ideas for this?
The remark from tyczj is correct but it does not give a solution to the problem.
In your F3, just override setUserVisibleHint(boolean) and when boolean is true, it means that F3 is now visible inside the ViewPager.
Note that you can rely on this method because you are using a ViewPager and it properly set the user visible hint when a fragment is shown.
When you are not using ViewPager, you can't rely on this method unless you are explicitly calling the method when you know that the fragment is visible.
EDIT : setUserVisibleHint() is not called by the ViewPager, but by the FragmentPagerAdapter.
Because a ViewPager loads the next view so that it is ready when you want to scroll to the next fragment. by default the viewpager loads the previous current and next fragment in the ViewPager so when you scroll from F1 to F2, F3 is going to be loaded in so that you have a smooth scroll when you go to F3
The previous answer tells you why what you are doing won't work. But to correct it you will want to create a AsyncTaskLoader and use the fragments LoaderManager to load and manage the task. See http://developer.android.com/guide/components/loaders.html