在FragmentPagerAdapter中管理片段生命周期

时间:2016-09-30 08:38:50

标签: android android-fragments fragmentpageradapter

我的应用主要活动上有一个片段寻呼机。 我还有一个操作栏按钮,用于设置一些值,然后请求刷新其中一个片段(仪表板片段)(仅当仪表板片段显示时,操作栏按钮才可见) 它工作正常,除非系统回收内存(任务远离并打开其他几个应用程序并返回我的应用程序)

当我点击操作栏按钮并到达refreshDashboard()时,我得到一个NPE,因为仪表板片段为空。

实际上,getItem()仅在最初创建主机活动时被调用,而不是在第二次创建活动时被调用。

我尝试在instanciateItem()的覆盖中创建片段,但只是创建了空白片段。

使适配器实现Parcelable可能很乏味。

当系统回收内存时,是否有一种保存方式来重新创建片段(不泄漏任何内容)?

我的活动:

public class HomeActivity extends AppCompatActivity {

   @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_activity);
    enableActionBarOverflow();
    mPager = (ViewPager) findViewById(R.id.home_view_pager);
    mTabStrip = (PagerTabStrip) findViewById(R.id.home_pager_header);
    mPagerAdapter = HomePagerAdapter.newInstance(getSupportFragmentManager(), this);
    mPager.setAdapter(mPagerAdapter);
   }

}

和我的适配器:

public class HomePagerAdapter extends FragmentPagerAdapter {

public HomePagerAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
}

private DashboardFragment dashboardFragment;
private ListFragment listFragment;

private static Context mContext;

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

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            dashboardFragment = DashboardFragment.newInstance();
            return dashboardFragment;
        case 1:
            listFragment = ListFragment.newInstance();
            return listFragment;
    }
    return null;
}

public void refreshDashboard(){
    dashboardFragment.refresh();
}


@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return mContext.getResources().getString(R.string.tab_dashboard);
        case 1:
            return mContext.getResources().getString(R.string.tab_list);
    }
    return "";
}

public static HomePagerAdapter newInstance(FragmentManager supportFragmentManager, Context context) {
    HomePagerAdapter homePagerAdapter = new HomePagerAdapter(supportFragmentManager);
    mContext = context.getApplicationContext();
    return homePagerAdapter;
}
}

1 个答案:

答案 0 :(得分:0)

当方向发生变化(我的应用仅限肖像)时,我们注意到类似的问题FragmentPagerAdapter - How to handle Orientation Changes?

@koso提出的解决方案解决了我的问题。