Saya memiliki antarmuka fragmen dengan tab di sepanjang bagian bawah yang membuka fragmen berbeda di tampilan utama.
Saya memiliki satu fragmen tertentu yang merupakan daftar item. Jika pengguna memilih salah satu item dalam daftar ini, fragmen lain terbuka yang berisi viewpager yang menggulir secara horizontal di antara semua item dalam daftar di fragmen sebelumnya. Ini bekerja dengan baik.
Viewpager menggunakan FragmentPagerAdapter untuk menampilkan item.
Masalahnya muncul saat pengguna memilih item dalam daftar, melihatnya, lalu menekan tombol pada bilah tab untuk kembali ke daftar, lalu memilih item lain. Kedua kalinya item dipilih, layar kosong muncul sebagai ganti viewpager. Saya tidak menerima kesalahan dalam LogCat saya saat ini terjadi.
Mengapa viewpager hanya muncul pertama kali?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
Cursor mCursor;
public ViewPagerAdapter(FragmentManager fm, Cursor c) {
super(fm);
mCursor = c;
}
public void changeCursor(Cursor c) {
mCursor = c;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
mCursor.moveToPosition(position);
return TeamCardFragment.newInstance(mCursor, position);
}
}
PagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
View mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
new setAdapterTask().execute();
return mView;
}
private class setAdapterTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(mCursorPosition);
}
}
FragmentPagerAdapter
danFragmentStatePagerAdapter
yang sebelumnya lebih cocok untuk beberapa halaman, ia mempertahankan semua fragmen dalam memori sehingga memiliki kinerja terbaik pada peralihan halaman, sementara yang terakhir lebih cocok untuk banyak halaman. halaman, itu menghancurkan fragmen, hanya mempertahankan statusnya, itu lebih hemat memori tetapi sedikit lebih lambat pada peralihan halaman.Saya berhasil menyelesaikan ini dengan mengganti
getFragmentManager()
dengangetChildFragmentManager()
di dalam fragmen induk. Fragmen induk ini membuat instance android.support.v4.app.FragmentPagerAdapter untuk memuat fragmen pageable (slideable), yang memerlukan pengelola fragmen dalam konstruktor. Untuk konstruktor ini saya meneruskan nilai kembaliangetChildFragmentManager()
.Tautan hackbod adalah kuncinya ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), yang ditemukan di postingan ini Fragmen dalam Fragmen
sumber
FragmentStatePagerAdapter
tidak menyelesaikan pertanyaan yang diajukan di sini. bersama denganFragmentStatePagerAdapter
dalam fragmen indukYourAdapter adapter = new YourAdapter (getChildFragmentManager());
harus ditambahkanbagi saya, saya harus memanggil ini di viewpager saya:
Saya memiliki masalah di mana viewpager tidak menyegarkan dan yang saya lihat hanyalah layar putih kosong di mana fragmen seharusnya berada. Saya meneruskan getChildFragmentManager tetapi tidak membantu.
sumber
Dalam kasus saya yang sangat khusus, saat saya menggunakan CoordinatorLayout dengan AppBarLayout dan ViewPager, yang memecahkannya adalah menghapus android: fitSystemWindows = "true" dari properti xml AppBarLayout saya .
Jangan tanya kenapa. Saya tahu kedengarannya agak konyol dan sepertinya tidak ada korelasi, tetapi baris tunggal inilah satu-satunya yang menyebabkan masalah karena saya sudah menggunakan getChildFragmentManager () di adaptor saya. Saya menghabiskan sepanjang hari men-debug kode saya hanya untuk menemukan ini, jadi saya harap ini menghemat waktu orang lain.
sumber
Saya memiliki masalah yang sama ketika saya mengubah adaptor dari
FragmentPagerAdapter
menjadiFragmentStatePagerAdapter
dangetFragmentManager()
di fragmen induk menjadigetChildFragmentManager()
Alasan di balik ini sangat
FragmentStatePagerAdapter
membantu dalam menyimpan sejumlah besar halaman dan memori yang terkait dengan setiap halaman yang dikunjungi lebih sedikit karena hanya menyimpan status fragmen yang disimpan sementara halaman tidak terlihat. Ini mengurangi overhead saat beralih antar fragmen.sumber
Cobalah untuk menempatkan
setOffscreenPageLimit (int limit)
pada orang tua ViewPager.Ini bekerja untuk saya seperti pesona.
Dalam kasus saya, saya memiliki pecahan di dalamnya
TabLayout
denganViewPager.
Dan satu lagi
ViewPager
di dalam pecahan itu. Pertama kali semua berfungsi dengan baik tetapi ketika saya mengubah tab dan kembali, beberapa fragmen saya kosong.sumber
Ini akan membantumu.
sumber
Kami mengatasi ini dengan mengimplementasikan kembali item view pager sebagai tampilan standar, bukan sebagai fragmen, dan mengubah adaptor yang sesuai.
sumber
Saya mendapatkan masalah yang sama ini di Xamarin Android dengan layar kosong untuk kedua kalinya .. Pengaturan berikut memperbaikinya untuk saya.
sumber
Anda juga dapat menginisialisasi adaptor jika Anda mengalami error ini saat aplikasi Anda diminimalkan dan kemudian dipanggil.
sumber
Saya memiliki hal yang sama, di saat kedua saya memanggil Adaptor Pager, tampilan anak mengembalikan NullPointerException. Dan mengubah adapder di FragmentStatePagerAdapter juga menyelesaikan masalah saya.
sumber
Ubah
FragmentPagerAdapter
keFragmentStatePagerAdapter
Gunakan,getChildFragmentManager()
bukangetFragmentManager()
getChildFragmentManager()
- karena menurut dokumentasi, ini akan mengembalikan FragmentManager pribadi untuk menempatkan dan mengelola Fragmen di dalam Fragmen ini. Sementara itugetFragmentManager()
akan mengembalikan FragmentManager untuk berinteraksi dengan fragmen yang terkait dengan aktivitas inisumber
class ViewPagerAdapter memperluas FragmentStatePagerAdapter ini berfungsi untuk saya coba ini
sumber