Home > Mobile >  Why TabLayout + ViewPager + fragments, fragments onHiddenChanged methods don't walk
Why TabLayout + ViewPager + fragments, fragments onHiddenChanged methods don't walk

Time:11-04

Why TabLayout + ViewPager + fragments, fragments onHiddenChanged methods don't walk

CodePudding user response:

Because fragments were destroyed after the new, not the original

CodePudding user response:

First set viewpager setOffscreenPageLimit to the total number of fragments, prevent fragments destroyed, secondly, switching fragments will call setUserVisibleHint method, rather than onHiddenChanged, specific see FragmentPagerAdapter the code, reference
 
Public abstract class FragmentPagerAdapter extends PagerAdapter {
.
Public Object instantiateItem (ViewGroup container, int position) {
If (this. MCurTransaction==null) {
Enclosing mCurTransaction=this. MFragmentManager. BeginTransaction ();
}

Long itemId=this. GetItemId (position);
String name=makeFragmentName (container. GetId (), itemId);
Fragments fragments=this. MFragmentManager. FindFragmentByTag (name);
If (fragments!=null) {
This. MCurTransaction. Attach (fragments);
} else {
Fragments=enclosing the getItem (position);
This. MCurTransaction. Add (container. GetId (), fragments, makeFragmentName (container. The getId (), itemId));
}

If (fragments!=this. MCurrentPrimaryItem) {
Fragments. SetMenuVisibility (false);
Fragments. SetUserVisibleHint (false);
}

Return fragments;
}

Public void destroyItem (ViewGroup container, int the position, the Object Object) {
If (this. MCurTransaction==null) {
Enclosing mCurTransaction=this. MFragmentManager. BeginTransaction ();
}

This. MCurTransaction. Detach ((fragments) object);
}

Public void setPrimaryItem (ViewGroup container, int the position, the Object Object) {
Fragments fragments=(fragments) object;
If (fragments!=this. MCurrentPrimaryItem) {
If (this. MCurrentPrimaryItem!=null) {
This. MCurrentPrimaryItem. SetMenuVisibility (false);
This. MCurrentPrimaryItem. SetUserVisibleHint (false);
}

If (fragments!=null) {
Fragments. SetMenuVisibility (true);
Fragments. SetUserVisibleHint (true);
}

Enclosing mCurrentPrimaryItem=fragments;
}
}
}

CodePudding user response:

Only FragmentTransaction show () and hide () method will invoke onHiddenChanged () method

CodePudding user response:

GetUserVisibleHint is currently visible

CodePudding user response:

Yes, but why, what circumstance onHidenchanged effective
  • Related