is it possible to switch between Fragments without re-creating them all the time? If so, how?
In the documentation I found an example of how to replace Fragments.
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
But I don't want to create my Fragments from the scratch every time I need them.
I also found this example of hiding/showing Fragments:
// The content view embeds two fragments; now retrieve them and attach
// their "hide" button.
FragmentManager fm = getFragmentManager();
addShowHideListener(R.id.frag1hide, fm.findFragmentById(R.id.fragment1));
addShowHideListener(R.id.frag2hide, fm.findFragmentById(R.id.fragment2));
But how would I create a fragment with an ID outside an XML file?
I think this might be related to this question, but there isn't an answer. :/
Thank you very much in advance, jellyfish
Edit:
That's how I'm doing it now:
Fragment shown = fragmentManager.findFragmentByTag(shownFragment);
//...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (shown != null) fragmentTransaction.hide(shown);
//switch statetement for menu selection, just one example:
SettingsFragment set = (SettingsFragment) fragmentManager.findFragmentByTag(SET);
Toast.makeText(this, "Settings:" + set, Toast.LENGTH_LONG).show();
if (set == null)
{
set = new SettingsFragment();
fragmentTransaction.add(R.id.framelayout_content, set, SET);
}
else fragmentTransaction.show(set);
shownFragment = SET;
fragmentTransaction.commit();
If I call up the settings, then something else, and then go back to settings, the toast gives me "null" first and "Settings:SettingsFragment{40ef..." second.
However, if I replace fragmentTransaction.add(R.id.framelayout_content, set, SET);
with fragmentTransaction.replace(R.id.framelayout_content, set, SET);
I keep getting "null", "null", "null"... so it doesn't seem to find the Fragment by tag.
Edit2:
Adding fragmentTransaction.addToBackStack(null);
did the trick. :)
This saves the whole hiding/memorizing which fragment is shown part so I suppose it's the most elegant solution for this.
I found this tutorial quite helpful on the topic.
Edit3:
Looking at my code I realized I could get rid of some parts, so I changed it to:
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (shown != null) fragmentTransaction.hide(shown);
Settings set = (Settings) fragmentManager.findFragmentByTag(SET);
if (set == null) set = new Settings();
fragmentTransaction.replace(R.id.framelayout_content, set, SET);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
However, this invoked an IllegalStateException: Fragment already added
, much the same like here. Is there an easy way to prevent this? Otherwise I think I might switch back to the hide/show bit.