我的应用主要活动上有一个片段寻呼机。 我还有一个操作栏按钮,用于设置一些值,然后请求刷新其中一个片段(仪表板片段)(仅当仪表板片段显示时,操作栏按钮才可见) 它工作正常,除非系统回收内存(任务远离并打开其他几个应用程序并返回我的应用程序)
当我点击操作栏按钮并到达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;
}
}
答案 0 :(得分:0)
当方向发生变化(我的应用仅限肖像)时,我们注意到类似的问题FragmentPagerAdapter - How to handle Orientation Changes?
@koso提出的解决方案解决了我的问题。