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É
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..
OriginalL'auteur vetalitet | 2014-02-16
Vous devez vous connecter pour publier un commentaire.
C'était juste un mauvais logique de l'ajout de fragments. Une bonne solution pourrait être trouvée ici: bonne réponse
OriginalL'auteur vetalitet
Vérifier si le fragment est déjà ajouté ou non à l'aide de la Fragment de la classe de
#isAdded()
méthode. Alors, de remplacer ou d'ajouter le fragment en conséquence:Supposons votre fragment a été appelé
fragment
OriginalL'auteur Jiju Induchoodan