具有片段问题的Appcompat ActionBar选项卡

时间:2014-07-17 11:17:04

标签: android android-fragments android-actionbar-compat

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()

为什么以这种方式调用所有片段?

1 个答案:

答案 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();
    }
}