Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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();
}