Android Honeycomb: как изменить фрагменты в FrameLayout, не создавая их заново?

можно ли переключаться между фрагментами, не создавая их постоянно? Если да, то как?

В документации я нашел пример того, как заменить фрагменты.

// 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?

Думаю, это может быть связано с этим вопросом , но ответа нет. : /

Заранее большое спасибо, как?

В документации я нашел пример того, как заменить Фрагменты.

// 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?

Я думаю, это может быть связано с этим вопросом , но ответа нет. : /

Заранее большое спасибо, как?

В документации я нашел пример того, как заменить Фрагменты.

// 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();

Если я вызываю настройки, затем что-то еще, а затем возвращаюсь к настройкам, тост сначала дает мне «ноль» и «Настройки» : 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: фрагмент уже добавлен , почти то же самое, что здесь ]. Есть ли простой способ предотвратить это? В противном случае я думаю, что смогу снова переключиться на бит скрытия / отображения.

14
задан Community 23 May 2017 в 12:09
поделиться