在选项卡更改时保留先前加载的片段实例,而不是在android中创建新实例

时间:2016-06-06 11:43:07

标签: android eclipse android-fragments tabs android-viewpager

我有一个标签滑动布局,其中包含四个标签,每个标签都有自己的布局和片段,在我的主要活动布局中, viewpager 参与更改标签。应用程序启动时加载特定视图(选项卡),并在选项卡更改时加载其他视图。我的问题是,当我转向第三个或第四个标签(而不是第二个标签)时,它的新实例会创建相应的片段而不是加载以前创建的片段(仅针对第二个选项卡发生的预期行为)。当我导航到第二个选项卡(SecondPageFragment())并再次返回第一个选项卡时,它工作正常并且没有创建新的IndexFragment,它加载相反,以前创建的片段在这种情况下一切都很好但是当我转到第三个或第四个选项卡然后返回到第一个选项卡时,它会创建一个新的IndexFragment实例。

可能的原因是什么以及为什么它只发生在第三个,第四个等选项卡上,只有第二个选项卡工作正确并且符合预期????

这是我的代码,用于切换标签及其相应的片段

public class TabsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        return new ForthPageFragment();

    case 1:
        return new ThirdPageFragment();
    case 2:
        return new SecondPageFragment();
    case 3:
        return new IndexFragment();
        default :
            break;
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 4;
}

}

这是我的主要活动代码:

public class MainActivity extends  FragmentActivity implements
ActionBar.TabListener {
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "صفحه چهارم","صفحه سوم","صفحه دوم","صفحه اصلی" };
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Initilization
    viewPager = (ViewPager)findViewById(R.id.tabpager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        
    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
    viewPager.setCurrentItem(3);
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    viewPager.setCurrentItem(tab.getPosition());
}
}

1 个答案:

答案 0 :(得分:2)

viewPager.setOffscreenPageLimit(3);