public static class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm, HomeActivity activity) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
case 2:
return new FragmentThree();
default:
return null;
}
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position)
{
case 0 : return "Fragment 1";
case 1 : return "Fragment 2";
case 2 : return "Fragment 3";
//TODO
default : return "";
}
}
}
以上是视图寻呼机的适配器。问题是:
单击选项卡1时, FragmentOne 的 onResume()和 FragmentTwo 将被调用。
将Tab1转到选项卡2, FragmentThree 的 onResume()被调用。
将Tab2转到Tab 3, FragmentOne 的 onPause()被调用。
将Tab3转到选项卡2,调用 FragmentOne 的 onResume()。
为什么以这种方式调用所有片段?
答案 0 :(得分:2)
答案与ViewPager的工作方式有关。默认情况下,它存储三个片段:当前显示的片段,前一个片段和下一个片段(如果存在)。如果你想阻止Pager加载额外的碎片你可以调用它的方法setOffscreenPageLimit(0),但实际上我不建议这样做。所以这不是一个问题,它的工作方式是打算工作的。
UPD:顺便说一句,如果你想让你的Pager更有效,你可以使用FragmentStatePagerAdapter而不是FragmentAdapter,它实际上会破坏片段而不是简单地分离它们。
UDP2:我非常抱歉,但offscreenPageLimit可以不低于1.因此,在您的情况下,由于您的Fragment显示ProgressDialog,它会将其主机Activity作为上下文传递。这就是当显示相邻片段时ProgressDialog出现的原因。因此,在Fragment的onResume()方法中,您应该检查片段的UservisibleHint,以检查这是否是片段,向用户显示。如果是,则显示对话框,如果不是,则关闭它。像这样:
@Override
public void onResume() {
super.onResume();
if (getUserVisibleHint()) {
progressDialog = ProgressDialog.show(getActivity(), "blah-blah-blah", "blah-blah-blah");
}
else {
if (progressDialog != null && progressDialog.isShowing()) progressDialog.dismiss();
}
}