Можно ли переключаться между фрагментами без повторного создания их все время? Если да, то как?
В документации я нашел пример того, как заменить фрагменты.
// 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();
Но я не хочу создавать свои Фрагменты с нуля каждый раз, когда они мне нужны.
Я также нашел этот пример скрытия/показа Фрагменты:
// 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));
Но как мне создать фрагмент с идентификатором вне XML файла?
Я думаю, что это может быть связано с этим вопросом, но ответа нет.:/
Спасибо вам большое заблаговременно, медузы
Edit:
Вот как я это делаю сейчас:
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();
Если я вызову настройки, затем что-то еще, а затем вернусь к настройкам, тост сначала даст мне "null" и "Настройки: SettingsFragment {40ef..." second.
Однако, если я заменяю fragmentTransaction.add(R.id.framelayout_content, set, SET);
на fragmentTransaction.replace(R.id.framelayout_content, set, SET);
, я продолжаю получать "null", "null", "null"... поэтому он не находит фрагмент по тегу.
Edit2:
Добавление fragmentTransaction.addToBackStack(null);
сделало трюк.:)
Это сохраняет все скрытие/запоминание того фрагмента, который показан в части, поэтому я считаю это самым изящным решением для этого.
Я нашел этот учебник, весьма полезный по этой теме.
Edit3:
Посмотрев на мой код, я понял, что могу избавиться от некоторых частей, поэтому я изменил его на:
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();
Однако это вызвало IllegalStateException: Fragment already added
, то же самое, что и здесь. Есть ли простой способ предотвратить это? В противном случае, я думаю, что я могу вернуться к биту hide/show.