ActiviyがViewPagerをメンバ変数として保持し、ViewPagerにFragmentPagerAdapterを継承したクラスをセットしています
private void initTabLayout(int contentsType) { MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), this, contentsType); viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager); }
また、NavigationDrawerのイベントに合わせてFragmentPagerAdapterを再生成しています。
@Override public boolean onNavigationItemSelected(MenuItem menuItem) { menuItem.setChecked(true); drawerLayout.closeDrawers(); int itemId = menuItem.getItemId(); switch (itemId) { case R.id.nav_home: if(contentsType != MyPagerAdapter.CONTENTS_A) { contentsType = MyPagerAdapter.CONTENTS_A; initTabLayout(contentsType); } return true; case R.id.nav_favorite: if(contentsType != MyPagerAdapter.CONTENTS_B) { contentsType = MyPagerAdapter.CONTENTS_B; initTabLayout(contentsType); } return true; } return false; }
FragmentPagerAdapterを継承したクラスの詳細は以下のようになっております。
public MyPagerAdapter(FragmentManager fragmentManager, Context context, int contentsType) { super(fragmentManager); switch (contentsType){ case CONTENTS_A: fragments = new ArrayList<>(); fragments.add(MyFragment.newInstance(contentsType, 0)); fragments.add(MyFragment.newInstance(contentsType, 500)); fragments.add(MyFragment.newInstance(contentsType, 1000)); break; case CONTENTS_B: fragments = new ArrayList<>(); fragments.add(MyFragment.newInstance(contentsType ,0)); fragments.add(MyFragment.newInstance(contentsType, 0)); break; } } @Override public Fragment getItem(int position) { return fragments.get(position); }
ViewPagerのコンテンツとなるFragmentを継承したクラスは以下のようになっております。
public static MyFragment newInstance(int contentsType, int range) { MyFragment fragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putInt(ARG_KEY_CONTENTS_TYPE, contentsType); bundle.putInt(ARG_KEY_RANGE, range); fragment.setArguments(bundle); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Bundle arguments = getArguments(); contentsType = arguments.getInt(ARG_KEY_CONTENTS_TYPE); range = arguments.getInt(ARG_KEY_RANGE); View view = inflater.inflate(R.layout.fragment_my, container, false); return view; }
現在問題となっておりますのは、NavigationDrawerのイベントでMyPagerAdapterを初期化し、Fragmentを生成し直した場合でもBundleにセットした値(contentsType, range)が変わらないことです(一番初めにセットした値が継続して取得される)。一番初めの初期化以外、FragmentのonCreate()が呼べれていないことから、Fragmentのライフサイクルに原因があるのではないかと思っております。
具体的にやりたいことはBundleの値の更新ですが、Fragmentの生成として正しい作法がありましたらそれも教えていただけると幸いです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。