Saya memiliki proyek yang ingin saya migrasikan ke Komponen Arsitektur Navigasi .

Sebelum migrasi, saya memiliki aktivitas yang memiliki fragmen yang menghosting ViewPager; dan saya dapat mengakses metode dalam fragmen ini dari fragmen adaptor ViewPager dengan merujuk tag fragmen host yang telah saya tetapkan dalam transaksi fragmen:

MyFragment fragment = (MyFragment ) ((MyActivity) requireActivity())
        .getSupportFragmentManager().findFragmentByTag("fragment_tag"); 
fragment.someMethodInMyFragment();

Berikut adalah diagram yang menipu bagian dari migrasi, dan apa yang perlu saya akses melalui panah kuning:

enter image description here

Dalam komponen Navigasi, saya tidak menemukan peluang untuk atur tag ke fragmen tujuan yang menghosting ViewPager, sehingga saya dapat mengaksesnya melalui tag seperti sebelumnya. Selain itu, fragmen adaptor ViewPager bukan merupakan bagian dari komponen Navigasi.

Apa yang saya coba: Dalam fragmen adaptor ViewPager:

Percobaan 1

MyFragment fragment = (MyFragment) getParentFragment(); // This returns the navigation host fragment. So ClassCastException is raised
fragment.someMethodInMyFragment();

Percobaan 2

MyFragment fragment = (MyFragment) requireActivity().getSupportFragmentManager()
     .findFragmentById(R.id.myFragment); // id of myFragment in the nav graph.
fragment.someMethodInMyFragment(); // fragment is null

MEMPERBARUI:

Memposting ViewPager adaptor

public class PageFragmentPagerAdapter extends FragmentStatePagerAdapter {

    public PageFragmentPagerAdapter(FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return MyPagerFragment.newInstance(position);
    }


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

}

Dan saya menyiapkan ViewPager di MyFragment seperti di bawah ini

public class MyFragment extends Fragment {
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ViewPager viewPager = view.findViewById(R.id.viewpager);
        PageFragmentPagerAdapter adapter = new PageFragmentPagerAdapter(requireActivity()
                                                   .getSupportFragmentManager());
        viewPager.setAdapter(adapter);
    }
0
Zain 30 Juni 2020, 18:14

1 menjawab

Jawaban Terbaik

Masalah Anda adalah Anda menggunakan requireActivity().getSupportFragmentManager() sebagai FragmentManager untuk adaptor Anda.

Sebagai gantinya, Anda harus selalu menggunakan getChildFragmentManager() untuk Fragmen yang sepenuhnya terkandung dalam fragmen lain - Anda akan mencatat bahwa di bawah perubahan konfigurasi atau proses kematian dan pembuatan ulang, ini diperlukan untuk memulihkan status setiap Fragmen dengan benar.

Saat Anda menggunakan anak FragmentManager, maka requireParentFragment() akan mengembalikan fragmen yang benar yang Anda cari.

1
ianhanniballake 30 Juni 2020, 22:35