Удаление фрагментов из активности
FragmantClass rSum = new FragmantClass();
getSupportFragmentManager().beginTransaction().remove(rSum).commit();
Я пытаюсь удалить этот фрагмент, когда я загружаю другой фрагмент. Вышеприведенный фрагмент не удаляется. Вот метод, который я вызываю для переключения фрагментов.
public void switchContent(Fragment fragment) {
FragmantClass rSum = new FragmantClass();
getSupportFragmentManager().beginTransaction().remove(rSum).commit();
mContent = fragment;
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
getSlidingMenu().showContent();
}
Ответы
Ответ 1
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();
Попробуйте это, он должен работать.
public void switchContent(Fragment fragment) {
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();
mContent = fragment;
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
getSlidingMenu().showContent();
}
Ответ 2
В моем личном случае я добавляю и удаляю фрагмент следующим образом:
if(getSupportFragmentManager().findFragmentById(R.id.container) != null) {
getSupportFragmentManager()
.beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.container)).commit();
}
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment)
.commit();
Всегда хорошо проверять, имеет ли ваш контейнер фрагмент или будет иметь исключение null
Ответ 3
Это очень простое решение для SupportFragmentManager
. FragmentManager
не совсем удобен, но эффективен:
List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
// You might have to access all the fragments by their tag,
// in which case just follow the line below to remove the fragment
if (fragmentList == null) {
// code that handles no existing fragments
}
for (Fragment frag : fragmentList )
{
// To save any of the fragments, add this check
// a tag can be added as a third parameter to the fragment when you commit it
if (frag.getTag().equals("<tag-name")) {
continue;
}
getSupportFragmentManager().beginTransaction().remove(frag).commit();
}
или, если вы вынуждены использовать его (но не рекомендуется):
.commitAllowingStateLoss();
Если вы удаляете все фрагменты из представления несколько раз, вы можете проверить, является ли текущий фрагмент нулевым или isDetached()
или isRemoving()
, или вы можете получить NullPointerExceptions
.
Обновление 6-9-15: Документация для getSupportFragmentManger().getFragments()
теперь, по-видимому, скрыта, но все же отлично работает в моем коде. Вот скриншот документации:
![enter image description here]()
Обновление 8-3-15. Если вы не используете библиотеку поддержки для фрагментов, к сожалению, нет getFragments()
, но есть еще пара, более неудобные варианты.
- Дайте каждому
fragment
a tag
или id
при создании и проведите через них, чтобы обработать каждый fragment
по желанию.
- Создайте прослушиватель с помощью
onAttachListener
, поэтому каждый раз, когда к activity
присоединяется новый fragment
, вы можете сохранить это fragment
, а затем перебирать эту структуру данных для обработки каждого fragment
по желанию.
Если вы не используете getSupportFragmentManager()
, для обработки транзакции вам нужно будет использовать getFragmentManager()
.