简体   繁体   中英

java.lang.IllegalStateException: Fragment already added

I receive IllegalStateException : Fragment already added when changing screen orientation. I have one Activity and three fragments

CODE:

private Fragment mFragment;
...
    @Override
protected void onCreate(Bundle savedInstanceState) {
initViews();
setBackStackBehavior();
mFragment = getSupportFragmentManager().findFragmentByTag(Constants.FIND_FRAGMENT_BY_TAG);

    if (mFragment == null) {
        mFragment = new SectionFragment();
    }
getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, mFragment, Constants.FIND_FRAGMENT_BY_TAG).commit();


private void setBackStackBehavior() {

        getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getSupportFragmentManager().popBackStack();
            getSupportFragmentManager().executePendingTransactions();
        }
    });
                } else {
                    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                    mDrawerToggle.syncState();
                    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            mDrawerLayout.openDrawer(GravityCompat.START);
                        }
                    });
                }
            }
        });
    }

Also I can move to the First Fragment :

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.section_selection:
                mFragment = new SectionFragment();

                getSupportFragmentManager().beginTransaction()
                        .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left,
                                R.anim.enter_from_left, R.anim.exit_to_right)
                        .replace(R.id.container, mFragment, Constants.FIND_FRAGMENT_BY_TAG)
                        .commit();

                return true;
            case R.id.exit:
                finish();
            default:
                return super.onOptionsItemSelected(item);
        }
    }

I tried to create ArrayList<Fragment> mAdded and add here Fragment after transaction and then,when all fragments was added :

if(mAdded.contains(mFragment.getClass())){
            getSupportFragmentManager().beginTransaction()
                    .show( mFragment).commit();
        }

It did not help. Tried to remove Fragment in onPause(), but it did not solve my problem too. I tried to use commitAllowingStateLoss () instead commit()

How to fix this bug?

In oncreate check whether saved instance state is null if not don't replace the fragment.Also you can check whether your fragment is already added and available by using find fragment by id.

if(savedInstanceState == null){
   getSupportFragmentManager().beginTransaction()
        .replace(R.id.container, 
                  mFragment,Constants.FIND_FRAGMENT_BY_TAG).commit();
}

or

    if(((Fragment) getSupportFragmentManager().findFragmentByTag(Constants.FIND_FRAGMENT_BY_TAG)) == null){

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, 
                      mFragment,Constants.FIND_FRAGMENT_BY_TAG).commit();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM