Android标签未正确切换

时间:2014-07-30 17:37:05

标签: android android-fragments tabs android-viewpager

所以我在getItem类的FragmentPagerAdapter方法中有一些简单的代码:

@Override
public Fragment getItem(int i) {
    switch (i) {
        case 0:{
            return new FragmentOne();
        }
        default:
            return new FragmentTwo();
    }
}

其他信息:getCount返回4

但是,会发生的情况是第一个片段确实正确显示,但其余三个标签似乎有问题。当我滑动一次时,它会正确显示。我再次向右滑动(因此标签#3)并且没有显示任何内容。再次向右滑动(标签#4)没有。向左滑动(标签#3)正确显示。向左滑动(标签#2)没有。选项卡#1始终正确显示。我的碎片内部可能导致这个奇怪的错误?它确实与我的片段有关,我知道:)

编辑:为了澄清这个问题,我尝试稍微改变一下环境 - 我做了ViewPager.setOffscreenPageLimit(3)以加载所有标签。我做了4个案例,每个案件得到一个不同的片段。现在发生的事情是应该在最后一个选项卡中的片段加载到第一个选项卡中,并且所有其他选项卡都是空的。

提前致谢!

1 个答案:

答案 0 :(得分:1)

尝试这样的事情。为您的活动编写内部课程:

class TabsPagerAdapter extends FragmentStatePagerAdapter {

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

    @Override
    public Fragment getItem(int index) {
        switch (index) {
            case 0:
                return firstTabFragment;
            case 1:
                return secondTabFragment;
        }
        return null;
    }

    @Override
    public int getCount() {
        return 2;
    }

}

onCreate 方法的Fragment类中,写 setRetainInstance(true)

onCreate 方法的活动中注册您的片段和标签,如下所示:

    // for fragments
    FragmentManager fragmentManager = getSupportFragmentManager();

    firstTabFragment = (FirstTabFragment) fragmentManager.findFragmentByTag(TAG_FIRST_FRAGMENT);
    if (firstTabFragment == null) {
        firstTabFragment = new FirstTabFragment();
        fragmentManager.beginTransaction()
                .add(R.id.pager, firstTabFragment, TAG_FIRST_FRAGMENT)
                .commit();
        firstTabFragment.setData(yourDataIfNeeded);
    }

    // for tabs
    String[] tabs = {getString(R.string.first_tab), getString(R.string.second_tab)};
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    TabsPagerAdapter mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    for (String tabText : tabs) {
        Tab tab = actionBar.newTab();
        tab.setText(tabText);
        tab.setTabListener(this);
        actionBar.addTab(tab);
    }

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

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

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

还为您的活动添加onSaveInstanceState方法,如下所示:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString(KEY_DATA, yourDataIfNeeded);
}