a obtenu “de java.lang.IllegalStateException: Fragment déjà active” lors de la mise en page n'est pas vide

J'ai d'activité et de téléavertisseur avec les 3 fragments. J'utilise des onglets pour la commutation.
Lorsque je clique sur des boutons que je veux remplacer fragment0.
Il ne fonctionne que lorsque fragment0 a vide de mise en page. Si j'ai mis un peu de contenu dans une page de fragment0 (il doit être listview) exception est levée:

java.lang.IllegalStateException: Fragment already active
    at android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:503)
    at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:110)
    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649)

Je utiliser la mise en page suivante:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:id="@+id/all_exp_frag"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent">

<ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/all_expenses"/>

</LinearLayout>

Activité:

public class Activity extends FragmentActivity {
private List<Fragment> fragments;
private MyPagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
fragments = asList(new Fragment0(), new Fragment1(), new Fragment2());
//initialize pager, etc.
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), pager);
}
//handle add new fragment button
@Override
public boolean onOptionsItemSelected(MenuItem item) { 
pagerAdapter.replaceCurrentFragment(new Fragment3());
}
public class MyPagerAdapter extends FragmentStatePagerAdapter {
final ViewPager pager;
public MyPagerAdapter(FragmentManager fm, ViewPager pager) {
super(fm);
this.pager = pager;
}
@Override
public CharSequence getPageTitle(int position) {
return fragments.get(position).getFragmentTitle();
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getItemPosition(Object object) {
if (object instanceof ExpensesFragment) {
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
public void replaceCurrentFragment(BaseFragment fragment) {
final int currentPosition = pager.getCurrentItem();
final BaseFragment old_fragment = fragments.get(currentPosition);
if (old_fragment == null) {
return;
}
this.startUpdate(pager);
getSupportFragmentManager()
.beginTransaction()
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.remove(old_fragment)
.add(pager.getId(), fragment)
.commitAllowingStateLoss();
fragments.set(currentPosition, fragment);
this.finishUpdate(pager);
this.notifyDataSetChanged(); //IN THIS LINE EXCEPTION IS THROWN WHEN LAYOUT IS NOT EMPTY (contains listview). IF EMPTY - IT WORKS FINE.
listener.onPageSelected(0);
}
}
}

Application throws exception sur la ligne

.notifyDataSetChanged();

si la disposition n'est pas vide.

Je ne trouve pas de solution comment faire pour éviter cette exception et de les remplacer fragment correctement.

ÉDITÉ

https://android.googlesource.com/platform/frameworks/support/+/jb-mr1-dev/v4/java/android/support/v4/app/Fragment.java

comme je l'ai vérifié Fragment de la classe contenant la méthode suivante:

public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}

peut-être la façon dont je suis ajoutant des fragments n'est pas correcte..

A u got solution pour ce problème ?..veuillez mettre à jour la réponse.

OriginalL'auteur vetalitet | 2014-02-16