FragmentManager не удаляет динамически добавленные фрагменты

Я пытаюсь добавить/удалить DialogFragments в/из моего FragmentManager динамически, когда пользователь выполняет разные действия. Проблема в том, что FragmentManager не удаляет их все должным образом. Я вызываю функцию remove(), поэтому мне любопытно, почему эти Fragments не удаляются. Я искал в Интернете, и люди говорят, что метод удаления — это то, что вы должны использовать, чтобы удалить Fragments из FragmentManager.

Пример кода ниже, показывающий, что я делаю:

            // originally added `LoginRestFragment` with TAG_LOGIN_REST_FRAGMENT tag to Fragment Manager
            rest = new SettingsDialogFragment();
            FragmentManager fm = getFragmentManager();
            rest.setArguments(bundle);
            Fragment fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT);
            Log.d("frag_type", fragment.toString());
            fm.beginTransaction().remove(fragment).commit();
            fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT);
            Log.d("is_frag_removed", fragment.toString());
            // why does this return a Fragment type ^^ shouldn't it throw null errror?
            Log.d("rest", rest.toString());
            // ^ this shows rest has been updated from LoginRestFrament to SettingsDialogFragment
            fm.beginTransaction().add(rest, TAG_LOGIN_REST_FRAGMENT).commit();
            fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT);
            Log.d("frag_type", fragment.toString());
            // why is this not SettingsDialogFragment??

Отчеты журнала, показывающие, что представлено. Должен отметить, что на экране отображается уже не LoginRestFragment, а SettingsDialogFragment (как и ожидалось), а rest является переменной класса.

D/frag_type: LoginRestFragment
D/is_frag_removed: LoginRestFragment
D/rest: SettingsDialogFragment
D/frag_type: LoginRestFragment

person Community    schedule 26.08.2016    source источник
comment
Я считаю, что вам нужно дождаться завершения цикла потока пользовательского интерфейса, прежде чем коммиты действительно будут выполнены.   -  person DeeV    schedule 26.08.2016


Ответы (1)


Спасибо ДеВ! То, что вы сказали, верно, и именно так я нашел обходной путь для решения этой проблемы, ответ на который есть в this запись StackOverflow. По сути, вы можете просто использовать executePendingTransactions() на своем FragmentManager для динамического выполнения коммитов.

person Community    schedule 26.08.2016