Saya menggunakan pendekatan hybrid untuk fragmen yang berisi tampilan daftar. Tampaknya berhasil karena saya tidak mengganti fragmen saat ini, melainkan menambahkan fragmen baru dan menyembunyikan yang sekarang. Saya memiliki metode berikut dalam aktivitas yang menghosting fragmen saya:
public void addFragment(Fragment currentFragment, Fragment targetFragment, String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(0,0,0,0);
transaction.hide(currentFragment);
transaction.add(R.id.frame_layout, targetFragment, tag)
.addToBackStack(tag)
.commit();
}
Saya menggunakan metode ini dalam fragmen saya (berisi tampilan daftar) setiap kali item daftar diklik / diketuk (dan karenanya saya perlu meluncurkan / menampilkan fragmen detail):
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
SearchFragment currentFragment = (SearchFragment) fragmentManager.findFragmentByTag(getFragmentTags()[0]);
DetailsFragment detailsFragment = DetailsFragment.newInstance("some object containing some details");
((MainActivity) getActivity()).addFragment(currentFragment, detailsFragment, "Details");
getFragmentTags()
mengembalikan larik string yang saya gunakan sebagai tag untuk fragmen berbeda ketika saya menambahkan fragmen baru (lihat transaction.add
metode dalam addFragment
metode di atas).
Dalam fragmen yang berisi tampilan daftar, saya melakukan ini dalam metode onPause ():
@Override
public void onPause() {
ListView lv = (ListView) getActivity().findViewById(R.id.listView);
mListViewState = lv.onSaveInstanceState();
super.onPause();
}
Kemudian di onCreateView dari fragmen (sebenarnya dalam metode yang dipanggil di onCreateView), saya memulihkan status:
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}