在 Fragment 中使用 ViewPager 时出现一个奇怪的错误
I've got a weird bug when using a ViewPager inside a Fragment
好的,我会尽量把它说清楚。我有一个名为 CheckerManager 的片段,其中包含一个 ViewPager。此 ViewPager 将允许用户在 3 个 Fragment 之间滑动,所有这些 Fragment 都是另一个名为 CheckerFragment 的 Fragment 的实例。我正在使用 FragmentPagerAdapter 来处理分页。这是它的样子
private class PagerAdapter extends FragmentPagerAdapter {
CharSequence mTabTitles[];
public PagerAdapter(FragmentManager fm, CharSequence tabTitles[]) {
super(fm);
mTabTitles = tabTitles;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_LOTTO);
case 1:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_DAILY);
case 2:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_EURO);
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
return mTabTitles[position];
}
@Override
public int getCount() {
return 3;
}
}
我知道 ViewPager 总是会在当前 Fragment 的任一侧创建 Fragment。假设我的 3 个 CheckerFragment 分别称为 A、B 和 C,当前片段是 A。B 已经创建。但我的问题是,即使我仍在查看片段 A,片段 B 也是 'active' 片段。我所做的每个输入实际上对应于片段 B 而不是 A。活动片段始终是 ViewPager 最后创建的片段。
我看了很多东西,看看是否有人遇到过同样的问题,但我发现很难描述出问题所在。我认为这与所有 ViewPagers 片段都属于同一类型(即 CheckerFragment)这一事实有关。我在应用程序其他地方的片段内有一个 ViewPager 的工作实现,我能说的唯一区别是每个页面都是不同类型的片段。
如有任何帮助,我们将不胜感激!
*编辑
PagerAdapter adapter = new PagerAdapter(getChildFragmentManager(), tabTitles);
ViewPager viewPager = (ViewPager)view.findViewById(R.id.viewPagerChecker);
viewPager.setAdapter(adapter);
我觉得自己很蠢,但我发现了问题所在。在我的 CheckerFragment 中,我会调用 getArguments() 来检索一个 String extra,我会用它来确定如何布局片段。问题是我使这个额外的 CheckerFragment 静态成员。因此,每次创建新片段时,它都会使用最新的额外片段。
故事的寓意 - 如果您计划制作该片段的多个实例,请不要让您的片段成为额外的静态成员。
好的,我会尽量把它说清楚。我有一个名为 CheckerManager 的片段,其中包含一个 ViewPager。此 ViewPager 将允许用户在 3 个 Fragment 之间滑动,所有这些 Fragment 都是另一个名为 CheckerFragment 的 Fragment 的实例。我正在使用 FragmentPagerAdapter 来处理分页。这是它的样子
private class PagerAdapter extends FragmentPagerAdapter {
CharSequence mTabTitles[];
public PagerAdapter(FragmentManager fm, CharSequence tabTitles[]) {
super(fm);
mTabTitles = tabTitles;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_LOTTO);
case 1:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_DAILY);
case 2:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_EURO);
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
return mTabTitles[position];
}
@Override
public int getCount() {
return 3;
}
}
我知道 ViewPager 总是会在当前 Fragment 的任一侧创建 Fragment。假设我的 3 个 CheckerFragment 分别称为 A、B 和 C,当前片段是 A。B 已经创建。但我的问题是,即使我仍在查看片段 A,片段 B 也是 'active' 片段。我所做的每个输入实际上对应于片段 B 而不是 A。活动片段始终是 ViewPager 最后创建的片段。
我看了很多东西,看看是否有人遇到过同样的问题,但我发现很难描述出问题所在。我认为这与所有 ViewPagers 片段都属于同一类型(即 CheckerFragment)这一事实有关。我在应用程序其他地方的片段内有一个 ViewPager 的工作实现,我能说的唯一区别是每个页面都是不同类型的片段。
如有任何帮助,我们将不胜感激!
*编辑
PagerAdapter adapter = new PagerAdapter(getChildFragmentManager(), tabTitles);
ViewPager viewPager = (ViewPager)view.findViewById(R.id.viewPagerChecker);
viewPager.setAdapter(adapter);
我觉得自己很蠢,但我发现了问题所在。在我的 CheckerFragment 中,我会调用 getArguments() 来检索一个 String extra,我会用它来确定如何布局片段。问题是我使这个额外的 CheckerFragment 静态成员。因此,每次创建新片段时,它都会使用最新的额外片段。
故事的寓意 - 如果您计划制作该片段的多个实例,请不要让您的片段成为额外的静态成员。