切换到选项卡式布局中的另一个选项卡时,片段onStart()和onStop()不被调用

时间:2019-07-20 09:00:37

标签: android android-fragments

public class HomeActivity extends AppCompatActivity {
    Context context = HomeActivity.this;
    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_home);
       Toolbar toolbar = findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       mSectionsPagerAdapter = new 
       SectionsPagerAdapter(getSupportFragmentManager());
       mViewPager =  findViewById(R.id.container);
       mViewPager.setAdapter(mSectionsPagerAdapter);
       TabLayout tabLayout = findViewById(R.id.tabs);
       mViewPager.addOnPageChangeListener(new 
            TabLayout.TabLayoutOnPageChangeListener(tabLayout));
       tabLayout.addOnTabSelectedListener(new 
            TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    }

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0 : return new HomeFrag1();
            case 1 : return new HomeFrag2();
            case 2 : return new HomeFrag3();
        }
        return null;
    }

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

当我从片段1切换到片段2时,不调用片段1的onStop方法,但是当我从片段2切换到片段3时调用它。当我从片段2切换到片段1时,未调用onStart要么。

2 个答案:

答案 0 :(得分:3)

ViewPager上有一个名为offscreenPageLimit的属性-默认设置为1,这意味着ViewPager将从当前页面的任一侧保留1页-这就是前面提到的原因未调用生命周期回调。如果您真的只想在内存中保留一个片段,可以将setOffscreenPageLimit设置为0,这样您就可以得到想要的行为。

答案 1 :(得分:1)

根据this article

  

当页面不再可见或与可见页面相邻时,ViewPager要求适配器销毁它。

以上似乎可以解释您的问题。从1-> 2切换不会尝试破坏Page 1,因为它与可见的Page 2相邻。但是,切换2-> 3将破坏第1页,因为它不再与现在可见的第3页相邻。
同样,切换2-> 1不会重新创建Page 1,因为它以前没有被破坏过。

我建议您尝试覆盖onPause()onResume(),看看它们是否如您所愿。