Я пытаюсь научиться использовать Fragment
в android.
Я пытаюсь удалить старый Fragment
, когда новый Fragment
вызывает в android.
Удаление старого фрагмента из диспетчера фрагментов
Ответ 1
Вам нужно найти ссылку на существующий фрагмент и удалить этот фрагмент, используя приведенный ниже код. Вам нужно добавить/зафиксировать фрагмент, используя один тег ex. "TAG_FRAGMENT".
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
Вот и все.
Ответ 2
Если вы хотите заменить фрагмент на другой, вы должны добавить их динамически, в первую очередь. Фрагменты, жестко закодированные в 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();
Отправить это сообщение: Замена фрагмента другим фрагментом внутри группы действий
Refer1: Заменить фрагмент программно
Ответ 3
У меня была такая же проблема, чтобы удалить старые фрагменты. Я закончил расчищать макет, содержащий фрагменты.
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...
Я не знаю, создает ли это утечки, но это работает для меня.
Ответ 4
Вероятно, вы используете старый фрагмент, который хранит ссылку. См. Эту интересную статью Утечки памяти в Android - идентифицировать, лечить и избегать
Если вы используете addToBackStack, это позволяет ссылаться на фрагмент экземпляра, избегая сборщика мусора, стереть экземпляр. Экземпляр остается в списке фрагментов в менеджере фрагментов. Вы можете просмотреть список
ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
Следующий код не является лучшим решением (потому что не удалять старый экземпляр фрагмента, чтобы избежать утечек памяти), но удаляет старый фрагмент из списка фрагментов фрагмента.
int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);
Вы не можете удалить запись в arrayList, потому что приложение FragmentManager работает с индексом ArrayList, чтобы получить фрагмент.
Я обычно использую этот код для работы с 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();
}