ฉันใช้วิธีไฮบริดสำหรับชิ้นส่วนที่มีมุมมองรายการ ดูเหมือนว่าจะเป็นนักแสดงเพราะฉันไม่ได้แทนที่ชิ้นส่วนปัจจุบัน แต่แทนที่จะเพิ่มชิ้นส่วนใหม่และซ่อนชิ้นส่วนปัจจุบัน ฉันมีวิธีต่อไปนี้ในกิจกรรมที่โฮสต์แฟรกเมนต์ของฉัน:
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);
// use a fragment tag, so that later on we can find the currently displayed fragment
transaction.add(R.id.frame_layout, targetFragment, tag)
.addToBackStack(tag)
.commit();
}
ฉันใช้วิธีนี้ในส่วนของฉัน (ที่มีมุมมองรายการ) เมื่อใดก็ตามที่รายการคลิก / แตะ (และฉันต้องเปิด / แสดงส่วนรายละเอียด):
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()
ส่งกลับอาร์เรย์ของสตริงที่ฉันใช้เป็นแท็กสำหรับชิ้นส่วนที่แตกต่างกันเมื่อฉันเพิ่มส่วนใหม่ (ดูtransaction.add
วิธีการaddFragment
วิธีการข้างต้น)
ในส่วนที่มีมุมมองรายการฉันทำสิ่งนี้ในวิธีการ onPause ():
@Override
public void onPause() {
// keep the list view's state in memory ("save" it)
// before adding a new fragment or replacing current fragment with a new one
ListView lv = (ListView) getActivity().findViewById(R.id.listView);
mListViewState = lv.onSaveInstanceState();
super.onPause();
}
จากนั้นใน onCreateView ของแฟรกเมนต์ (จริง ๆ แล้วในวิธีที่เรียกใช้ใน onCreateView) ฉันกู้คืนสถานะ:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}