简体   繁体   中英

onResume() - for switching between multiple CHILD fragments

The basic problem I have is i'm trying to get a refresh function to execute every time i return to a specific fragment.

So far I've been using the workaround of utilizing setUserVisibleHint() as shown below.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        refresh();
    }
}

However, this only works when switching between my main fragment and this fragment in question . What i'm wondering is how do i get this code to execute when i switch from one of my other tabs?

Help would be much appreciated.

Root cause: This is a feature from Android called offscreen page limit , it will retain the number of fragments to either side of current fragment, default value is 1. In your case using setUserVisibleHint is not enough to refresh data.

Solution:

public class YourFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,Bundle savedInstanceState) {
            if (getUserVisibleHint()) { // fragment is visible to users.
                refresh();
            }
            return super.onCreateView(inflater, container, savedInstanceState);
        }

        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (isVisibleToUser && isResumed()) { // fragment is visible to users
                refresh();
            }
        }

        public void refresh(){

        }
}

Fragments inside Pager act as visible even if there are not currently visible to user, the affected fragments are differ based on Pager offscreenPageLimit so trying to refresh fragment inside setUserVisibleHint or onResume has no effect when using Pager.

However that is fine as it is intended behavior, the aim of Pager is to let user switch between pages as you switch tabs in your browser.. If you still insist on refreshing pages you can do this inside the Pager addOnPageChangeListener like this:

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);

                Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + position);
                if(fragment != null && fragment instanceof RefreshableFragment)
                    ((RefreshableFragment) fragment).refresh();

            }
        });

Under the fragment, you should call your method under onResume() callback of fragment.

public void onResume(){
  super.onResume();
  .....
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM