मैंने सूची दृश्य वाले टुकड़ों के लिए एक हाइब्रिड दृष्टिकोण का उपयोग किया। ऐसा प्रतीत होता है कि मैं वर्तमान टुकड़े को प्रतिस्थापित नहीं करता, बल्कि नया टुकड़ा जोड़कर वर्तमान को छिपाता हूं। मेरे कार्यकलाप में निम्नलिखित विधि है जो मेरे अंशों को होस्ट करती है:
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
विधि देखें )।
सूची दृश्य वाले टुकड़े में, मैं इसे अपने ऑनपॉज़ () विधि में करता हूँ:
@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);
}