私は、アプリケーションのメインアクティビティにフラグメントページャーを持っています。 また、いくつかの値を設定し、フラグメント(ダッシュボードフラグメント)の1つをリフレッシュするように要求するアクションバーボタンがあります(ダッシュボードフラグメントが表示されている場合にのみアクションバーボタンが表示されます)。 FragmentPagerAdapterでのフラグメントライフサイクルの管理
私がアクションバーボタンをクリックしてrefreshDashboard()に到達すると、ダッシュボードのフラグメントがnullのため、NPEを取得します。これは、システムがメモリを解放したときに実行されます。
実際、getItem()は、ホストアクティビティが最初に作成されたときにのみ呼び出されますが、アクティビティが2回目に作成されたときは呼び出されません。
私はinstanciateItem()のオーバーライドでフラグメントを作成しようとしましたが、ブランクフラグメントが作成されました。
アダプタをParcelableにするのは面倒です。
システムがメモリを再利用しているときにフラグメントを再作成するための節約方法がありますか(何も漏れることなく)ですか?
My活動:
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;
}
}