2

I have a tab activty in my application,

here is some simplified code:

@SuppressLint("NewApi")
public class Rhino68PanelActivity extends FragmentActivity implements ActionBar.TabListener {

static String TAG = "Rhino68PanelActivty";

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a
 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
 * will keep every loaded fragment in memory. If this becomes too memory
 * intensive, it may be best to switch to a
 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
 */
SectionsPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
ViewPager mViewPager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rhino68_panel);

    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    // When swiping between different sections, select the corresponding
    // tab. We can also use ActionBar.Tab#select() to do this if we have
    // a reference to the Tab.
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });

    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        // Create a tab with text corresponding to the page title defined by
        // the adapter. Also specify this Activity object, which implements
        // the TabListener interface, as the callback (listener) for when
        // this tab is selected.
        actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Network.cancelRequests(Rhino68PanelActivity.this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.rhino68_panel, menu);
    return true;
}   

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, switch to the corresponding page in
    // the ViewPager.
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        Fragment fragment = null;

        switch (position) {
        case 0: {
            fragment = new OneSectionFragment();
        }
            break;
        case 1: {
            fragment = new TwoSectionFragment();
        }
            break;
        case 2: {
            fragment = new ThreeSectionFragment();
        }
            break;
        default: {
            fragment = new OneSectionFragment();
        }
        }
        return fragment;
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return "1";
        case 1:
            "2";
        case 2:
            "3";
        }
        return null;
    }
}

public static class oneSectionFragment extends Fragment {


    private static Context mContext;

    public StatusSectionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_rhino68_panel_status, container, false);
        mContext = getActivity();
        // update view
        ....
        return rootView;
    }
    //fucntions and methods
}

    public static class twoSectionFragment extends Fragment {


    private static Context mContext;

    public StatusSectionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_rhino68_panel_status, container, false);
        mContext = getActivity();
        // update view
        ....
        return rootView;
    }
    //fucntions and methods
}

Now I have noticed something odd, which im not sure if it is just how it works or if i am doing something wrong.

I set a break point in each of my sectionfragments onCreateView() and now depending on how I navigate between the tabs the break points are hit or not.

case 1: If I start on tab 1, then navigate to tab 2 - no break points are hit if I then go back to tab 1 - again no break points are hit

case 2: If I start on tab 1, then navigate to tab 2 - no break points are hit if I then go to tab 3 - breakpoint in tab 3 is hit, if I then go back to 2 - no break point if I then go to 1 - tab 1 break point is hit

it seems as though it loads tab number 3 when you click on tab number 2. Now is this a property of the tab manager? or does my tab manager only think that there are 2 tabs?

Where am I meant to run code that must get update when the tab actually comes into view?

Zapnologica
  • 22,170
  • 44
  • 158
  • 253

1 Answers1

5

Try to use:

mViewPager.setOffscreenPageLimit(x);

This method set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. This setting defaults to 1. http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

Edu Molins
  • 111
  • 6