【问题标题】:Android tabs not switching correctlyAndroid 选项卡无法正确切换
【发布时间】:2014-07-30 17:37:05
【问题描述】:

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

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

附加信息:getCount 返回 4

但是,发生的情况是第一个片段确实显示正确,但其余三个选项卡似乎出错了。当我滑动一次时,它会正确显示。我再次向右滑动(所以选项卡#3)并且没有显示任何内容。再次向右滑动(标签 #4)什么也没有。向左滑动(标签 #3)正确显示。向左滑动(标签 #2)什么都没有。 Tab #1 始终正确显示。我的片段内部是什么导致了这个奇怪的错误?这绝对是我的碎片,我知道:)

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

提前致谢!

【问题讨论】:

  • 执行此操作时,您的设备是否已连接到您的机器?如果是这样,发生这种情况时 LogCat 中的日志是什么意思?
  • 已连接。 LogCat 中没有任何内容指向适配器。

标签: android android-fragments tabs android-viewpager


【解决方案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);
}

【讨论】:

  • 非常感谢您的回答!不幸的是,这并没有完全解决我的问题。我的错,我应该更清楚。所以这里的问题可能会好一点:当我做ViewPager.setOffScreenPageLimit(3)(为了加载所有页面)时,第一页包含最后一个片段,所有其他页面都是空的。可能是什么原因造成的? (我也会更新描述)。