Удаление старого fragmentа из диспетчера fragmentов

Я пытаюсь узнать, как использовать Fragment s в android. Я пытаюсь удалить старый fragment когда новый fragment вызывает в android.

Вам нужно найти ссылку на существующий fragment и удалить этот fragment, используя приведенный ниже код. Вам нужно добавить / зафиксировать fragment, используя один тег ex. “TAG_FRAGMENT”.

 Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); if(fragment != null) getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 

Вот и все.

Если вы хотите заменить fragment на другой, вы должны добавить их динамически, в первую очередь. Фрагменты, жестко закодированные в 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(); 

См. Это сообщение: Замена fragmentа другим fragmentом внутри группы действий

Refer1: Заменить fragment программно

У меня была такая же проблема, чтобы удалить старые fragmentы. Я закончил расчищать макет, содержащий fragmentы.

 LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList); layout.removeAllViewsInLayout(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ... 

Я не знаю, создает ли это утечки, но это работает для меня.

Вероятно, вы экземпляр старого fragmentа держит ссылку. См. Эту интересную статью Утечка памяти в Android – выявление, лечение и предотrotation

Если вы используете addToBackStack, это позволяет ссылаться на fragment экземпляра, избегая сборщика мусора стереть экземпляр. Экземпляр остается в списке fragmentов в менеджере fragmentов. Вы можете просмотреть список

ArrayList fragmentList = fragmentManager.getFragments();

Следующий код не является лучшим решением (потому что не удалять старый fragment, чтобы избежать утечек памяти), но удаляет старый fragment из списка fragmentов fragmentа

 int index = fragmentManager.getFragments().indexOf(oldFragment); fragmentManager.getFragments().set(index, null); 

Вы не можете удалить запись в arrayList, потому что, по общему мнению, FragmentManager работает с индексом ArrayList, чтобы получить fragment.

Обычно я использую этот код для работы с fragmentManager

 public void replaceFragment(Fragment fragment, Bundle bundle) { if (bundle != null) fragment.setArguments(bundle); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName()); //if oldFragment already exits in fragmentManager use it if (oldFragment != null) { fragment = oldFragment; } fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName()); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); fragmentTransaction.commit(); } 

Я была такая же проблема. Я придумал простое решение. Используйте fragment .replace вместо fragmentа .add . Замена fragmentа выполняется так же, как добавление fragmentа, а затем удаление его вручную.

 getFragmentManager().beginTransaction().replace(fragment).commit(); 

вместо

 getFragmentManager().beginTransaction().add(fragment).commit(); 
  • Разница между fragmentом и fragmentацией
  • Адаптер пейджера не отображает изображение после получения ответа от fragmentа
  • Выполнение действия после анимации транзакции fragmentа завершено
  • Как реализовать onBackPressed () & intents в fragmentе?
  • В чем преимущество использования fragmentов в Android, а не Views?
  • Меню Android Options в fragmentе
  • Анимация fragmentации: слайд и слайд
  • Отправка данных из вложенных fragmentов в родительский fragment
  • ListFragment не принимает мой макет
  • Почему обращается к TextView fragmentа внутри операции, вызывая ошибку
  • Заполненная активность ADT, созданная с использованием fragmentов.
  • Interesting Posts

    Как скомпилировать 64-битное приложение с помощью Visual C ++ 2010 Express?

    Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML

    Переименуйте файл в C #

    Как вы запрашиваете разрешения администратора, используя NSIS?

    Как включить автоматическое выключение Interactive ssh logins через один час

    Как передать аргументы командной строки программе Perl?

    Самая быстрая функция для генерации букв столбцов Excel в C #

    Как процессоры Xeon отличаются от обычных процессоров?

    Пейджинг UIScrollView с шагом меньше размера кадра

    Как правильно реализовать шаблон фабричного метода в C ++

    Очень высокий шум, когда компьютер делает что-то интенсивное?

    Преобразование значения цвета RGB в шестнадцатеричное

    Параметр Inout в асинхронном обратном вызове не работает должным образом

    Как синхронизировать статическую переменную среди streamов, работающих с разными экземплярами classа в Java?

    Когда фигурные скобки необязательны в синтаксисе lambda Java 8?

    Давайте будем гением компьютера.