Android «Фрагмент уже добавлен», несмотря на интеллектуальное управление фрагментамиAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android «Фрагмент уже добавлен», несмотря на интеллектуальное управление фрагментами

Сообщение Anonymous »

Мне кажется, что мой код хорошо работает с точки зрения управления фрагментами, поскольку я долгое время тестировал его вручную. Кроме того, Crashlytics также долгое время, до сегодняшнего дня, не уведомлял меня о том, что у пользователей возникают какие-либо проблемы с ним. Я получил уведомление об этой проблеме:
Неустрашимое исключение: java.lang.IllegalStateException
Фрагмент уже добавлен: FragmentFav{4b16cda

Код: Выделить всё

public class ActivityMain extends AppCompatActivity {

(...)
private BottomNavigationView bottomNavigationView;
private ViewGroup container;
private Fragment currFragment;
private Fragment bottomNavFragment;
private FragmentMain fragmentMain;
private FragmentFav fragmentFav;
private FragmentSearch fragmentSearch;
private FragmentShowNote fragmentShowNote;
private FragmentGroup fragmentGroup;

@Override
protected void onCreate(Bundle savedInstanceState) {

(...)
setFragments(savedInstanceState);

setContentView(R.layout.activity_main);
(...)
configureBottomNavigationView();
container = findViewById(R.id.content_frame);

if (savedInstanceState == null) {
currFragment = fragmentMain;
bottomNavFragment = fragmentMain;
} else {
currFragment = getSupportFragmentManager().getFragment(savedInstanceState, "current_fragment");
bottomNavFragment = getSupportFragmentManager().getFragment(savedInstanceState, "bottom_nav_fragment");
}

if (savedInstanceState == null) {
FragmentTransaction ft = fm.beginTransaction();
ft.add(container.getId(), fragmentMain, "main");
ft.commit();
}

(...)
}

private void setFragments(Bundle savedInstanceState) {
if (savedInstanceState == null) {
fragmentMain = new FragmentMain();
fragmentFav = new FragmentFav();
fragmentSearch = new FragmentSearch();
fragmentGroup = new FragmentGroup();
fragmentAbout = new FragmentAbout();
} else {
fragmentMain = fm.findFragmentByTag("main") != null ? (FragmentMain) fm.findFragmentByTag("main") : new FragmentMain();
fragmentFav = fm.findFragmentByTag("fav") != null ? (FragmentFav) fm.findFragmentByTag("fav") : new FragmentFav();
fragmentSearch = fm.findFragmentByTag("search") != null ? (FragmentSearch) fm.findFragmentByTag("search") : new FragmentSearch();
fragmentGroup = fm.findFragmentByTag("group") != null ? (FragmentGroup) fm.findFragmentByTag("group") : new FragmentGroup();
fragmentAbout = fm.findFragmentByTag("about") != null ? (FragmentAbout) fm.findFragmentByTag("about") : new FragmentAbout();
}
}

private void configureBottomNavigationView() {
bottomNavigationView = findViewById(R.id.bottomNavigation);
bottomNavigationView.setOnItemSelectedListener(item ->  {

FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in,    R.anim.fade_out);

if (item.getItemId() == R.id.action_main) {
doOnMainItemSelected(ft);
} else if (item.getItemId() == R.id.action_fav) {
doOnFavItemSelected(ft);
} else if (item.getItemId() == R.id.action_search) {
doOnSearchItemSelected(ft);
}

ft.commit();
return true;
});
}

private void doOnMainItemSelected(FragmentTransaction ft) {
manageOldFragment(ft);
ft.show(fragmentMain);

doAfterFragmentCommitment(fragmentMain);
bottomNavFragment = fragmentMain;
}

private void doOnFavItemSelected(FragmentTransaction ft) {
manageOldFragment(ft);
if (fragmentFav.isAdded())
ft.show(fragmentFav);
else
ft.add(container.getId(), fragmentFav, "fav");

doAfterFragmentCommitment(fragmentFav);
bottomNavFragment = fragmentFav;
}

private void doOnSearchItemSelected(FragmentTransaction ft) {
manageOldFragment(ft);
if (fragmentSearch.isAdded())
ft.show(fragmentSearch);
else
ft.add(container.getId(), fragmentSearch, "search");

doAfterFragmentCommitment(fragmentSearch);
bottomNavFragment = fragmentSearch;
}

private void manageOldFragment(FragmentTransaction ft) {
if (currFragment instanceof FragmentGroup || currFragment instanceof   FragmentShowNote) {
ft.remove(currFragment);
fm.popBackStack();
} else {
ft.hide(currFragment);
}
}

private void doAfterFragmentCommitment(Fragment fragment) {
if (fragment instanceof FragmentMain) {
currFragment = fragmentMain;
} else if (fragment instanceof FragmentFav) {
currFragment = fragmentFav;
} else if (fragment instanceof FragmentSearch) {
currFragment = fragmentSearch;
} else if (fragment instanceof FragmentGroup) {
currFragment = fragmentGroup;
} else if (fragment instanceof FragmentAbout) {
currFragment = fragmentAbout;
}

(...)
}

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);

getSupportFragmentManager().putFragment(outState, "current_fragment", currFragment);
getSupportFragmentManager().putFragment(outState, "bottom_nav_fragment", bottomNavFragment);
}
}
Как видите, чтобы избежать этой проблемы, я использую saveInstanceState, используйте findFragmentByTag() и используйте isAdded() там, где это возможно.
Итак, в чем может быть проблема?
Заранее спасибо.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... management
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»