возможно ли переключаться между фрагментами, не создавая их постоянно?Если да, то как?
В документации я нашел пример замены фрагментов.
// 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-файла?
Я думаю, это может быть связано с этим вопросом , но ответа нет.: /
Большое спасибо заранее, медуза
Редактировать:
Вот как я это делаю сейчас:
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», а затем «Settings: SettingsFragment {40ef ...».
, если я заменяю 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
, почти так же, как здесь .Есть ли простой способ предотвратить это?В противном случае я думаю, что мог бы вернуться к биту скрытия / показа.