5

J'ai besoin d'aide. em ajoutant un fragment à l'activité de cette façon. le problème est sur chaque appel de openFragment il crée le fragment et ajoute. ce qui est évident. Question: quelle modification je fais, de sorte qu'il ne peut ajouter un fragment qu'une seule fois. sur le prochain appel avec la même étiquette de fragment, il ne fera rien.Comment éviter d'ajouter le même fragment à empiler

cas: appuyez sur le bouton pour la première fois ajouter un fragment et des spectacles. je presse encore le même bouton il ne répond rien.

public static void openFragment(Activity activity, Fragment fragment) { 

    FragmentManager fragmentManager = ((ActionBarActivity) activity) 
      .getSupportFragmentManager(); 
     FragmentTransaction ftx = fragmentManager.beginTransaction(); 
     ftx.addToBackStack(fragment.getClass().getSimpleName()); 
     ftx.setCustomAnimations(R.anim.slide_in_right, 
       R.anim.slide_out_left, R.anim.slide_in_left, 
       R.anim.slide_out_right); 
     ftx.add(R.id.main_content, fragment); 
     ftx.commit(); 
} 

Répondre

5

Voici la solution, Il vous permettra seulement d'ajouter un fragment une fois dans la pile sinon il sortira le même fragment de la pile.

public static void openFragment(Activity activity, Fragment fragment) { 
    String fragmentTag = fragment.getClass().getName(); 
    FragmentManager fragmentManager= ((ActionBarActivity) activity) 
      .getSupportFragmentManager(); 

    boolean fragmentPopped = fragmentManager 
      .popBackStackImmediate(fragmentTag , 0); 

    if (!fragmentPopped && fragmentManager.findFragmentByTag(fragmentTag) == null) { 

    FragmentTransaction ftx = fragmentManager.beginTransaction(); 
    ftx.addToBackStack(fragment.getClass().getSimpleName()); 
    ftx.setCustomAnimations(R.anim.slide_in_right, 
      R.anim.slide_out_left, R.anim.slide_in_left, 
      R.anim.slide_out_right); 
    ftx.add(R.id.main_content, fragment); 
    ftx.commit(); 
    } 
} 

slide_in_right

<?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="true"> 
    <translate android:fromXDelta="100%" 
    android:toXDelta="0%" android:fromYDelta="0%" 
    android:toYDelta="0%" android:duration="200"> 
    </translate> 
</set> 

slide_out_right

<?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 
    <translate android:fromXDelta="0%" android:toXDelta="100%" 
    android:fromYDelta="0%" android:toYDelta="0%" 
    android:duration="200"> 
    </translate> 
</set> 

slide_in_left

<?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="true"> 
    <translate android:fromXDelta="-100%" 
    android:toXDelta="0%" android:fromYDelta="0%" 
    android:toYDelta="0%" android:duration="200"> 
    </translate> 
</set> 

slide_out_left

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="true"> 
    <translate android:fromXDelta="0%" 
    android:toXDelta="-100%" android:fromYDelta="0%" 
    android:toYDelta="0%" android:duration="200"> 
    </translate> 
</set> 

Et voici comment vous appelez cette fonction:

openFragment(activity, new MyFragment()); 
+0

S'il vous plaît, comment appeler la fonction openFragment (???, newfragment) et le code xml pour la diapositive d'animation ... – Webserveis

+1

vérifier la mise à jour – user3819810

5

Utilisation FragmentTransaction.replace() au lieu de FragmentTransaction.add():

Ceci est essentiellement le même que pour appeler remove(Fragment) tous les fragments actuellement ajoutés qui ont été ajoutés avec le même containerViewId puis add(int, Fragment, String) avec les mêmes arguments donnés ici.

Le premier appel à FragmentTransaction.replace() ajoutera simplement le fragment car il n'y avait aucun fragment à supprimer.

+0

i ne peut pas utiliser le remplacer en raison d'avoir réseau opérations. donc chaque visite au même fragment m'a coûté une nouvelle demande. – user3819810

0

Vous pouvez utiliser show() méthode de transaction fragment

FragmentManager fragmentManager = ((ActionBarActivity) activity) 
      .getSupportFragmentManager(); 
     FragmentTransaction ftx = fragmentManager.beginTransaction(); 

     ftx.setCustomAnimations(R.anim.slide_in_right, 
       R.anim.slide_out_left, R.anim.slide_in_left, 
       R.anim.slide_out_right); 
    if(!fragment.isAdded()) 
    { 
    //add fragment; 
ftx.add(R.id.main_content, fragment).comit(); 
    } 
    else 
    { 
    ftx.show(fragment).comit(); 
    } 

Mise à jour

+0

Je l'ai utilisé. mais ne fonctionne pas. pouvez-vous s'il vous plaît modifier cette vérification en fonction de mon code. merci – user3819810

+0

J'ai modifié et j'ai lu ci-dessus que vous faites des appels réseau de sorte qu'il ne fera un appel réseau qu'une seule fois lorsque le fragment est créé et une fois qu'il est créé, il va seulement le montrer la prochaine fois. Faites un appel de réseau dans si déclaration. – Hulk

0

Pour ajouter un fragment qu'une seule fois,

Vous devez vérifier chaque fois avant d'ajouter le fragment backstack, que si précédemment il est déjà ajouté ou non. S'il est déjà ajouté, , vous devriez alors ajouter cette entrée et en ajouter une autre.

Ainsi, vous pouvez le faire en utilisant:

boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0); 

Si fragmentPopped est vrai puis il y avait un fragment ajouté à backstack et itt est sauté et vous pouvez ajouter votre fragment maintenant à backstack. Il est sûr d'appeler:

ftx.addToBackStack(fragment.getClass().getSimpleName());

Si fragmentPopped est faux alors il n'y avait pas tout fragment ajouté dans backstack

informations Très belle, vous pouvez obtenir: here

1

En fonction de vos besoins , il existe plusieurs façons d'aborder cette question:

  1. Désactivez ou supprimez le bouton après l'avoir cliqué une fois. Comme suggéré par @hidro, utilisez replace() au lieu de add() lors de l'appel de FragmentTransaction.
  2. Conserver une liste de chaînes qui contiendra le nom de classe de chaque fragment lors de son ajout à l'interface utilisateur.

E.g.

List<String> fragments = new ArrayList<String>(); 

button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     FragmentTransaction ftx = fragmentManager.beginTransaction(); 
     ftx.add(R.id.main_content, fragment); 
     ftx.commit(); 
     fragments.add(fragment.getClass().toString()); 
    } 
}); 

Avant d'ajouter le fragment en utilisant FragmenTransaction.commit() vérifier si sa classe existe dans la liste et si elle le fait, ne l'ajoutez pas.

Encore une fois, ces 3 approches fonctionnent mais celle que vous choisirez dépendra de votre application.

+0

Je ne peux pas faire cela à tous les boutons (désactiver btn). et remplacer au lieu d'ajouter n'est pas un bon choix parce que je fais l'opération de réseau sur chaque fragment, ainsi cela m'a coûté plus. J'attends avec impatience le 3ème si je ne trouve pas une meilleure approche. merci – user3819810

1

vérifier si fragment est déjà ajouté ou non à l'aide de cette méthode:

if(!Fragment.isAdded()){ 
//add fragment 
}