Come evitare di aggiungere lo stesso frammento di stack

Ho bisogno di qualche aiuto. em aggiunta di un frammento di attività in questo modo. problema è che a ogni chiamata di openFragment creare frammento e aggiungere. il che è ovvio. Domanda: quali modifiche posso fare, quindi è possibile aggiungere frammento solo una volta. la chiamata successiva con lo stesso frammento di tag non farà nulla.

caso: premere il pulsante prima volta aggiungere frammento e spettacoli. premere nuovamente lo stesso tasto risposta è nulla.

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();
}

OriginaleL’autore user3819810 | 2015-03-19

6 Replies
  1. 9

    Ecco la soluzione, ti permette di aggiungere un frammento di una volta in stack altrimenti pop-out lo stesso frammento di stack.

    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>

    E questo è come si chiama questa funzione:

    openFragment(activity, new MyFragment());
    Per favore, come chiamare la funzione openFragment(???,newfragment) e il codice xml per la diapositiva di animazione…
    controllare l’aggiornamento

    OriginaleL’autore user3819810

  2. 5

    Utilizzare FragmentTransaction.replace() invece di FragmentTransaction.add():

    Questo è essenzialmente lo stesso come chiamare remove(Fragment) per tutti attualmente aggiunto frammenti che sono stati aggiunti con la stessa containerViewId e poi add(int, Fragment, String) con gli stessi argomenti indicati qui.

    La prima chiamata a FragmentTransaction.replace() semplicemente aggiungere il frammento come non c’erano frammenti di rimuovere.

    non posso usare sostituire a causa di avere per le operazioni di rete. così ogni visita dello stesso frammento mi è costato una richiesta di nuovo.

    OriginaleL’autore hidro

  3. 4

    controllare se il frammento è già stato aggiunto o non utilizzando questo metodo:

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

    OriginaleL’autore Irfan Qureshi

  4. 1

    A seconda delle tue esigenze, ci sono diversi modi per affrontare questo:

    1. Disattivare o rimuovere il pulsante è premuto una volta.
    2. Come @idromassaggio suggerito, usare replace() invece di aggiungere() quando si chiama il FragmentTransaction.
    3. Mantenere una Lista di stringhe che contiene il nome della classe di ogni frammento che viene aggiunto all’interfaccia utente.

    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());
        }
    });

    Prima di aggiungere il frammento usando FragmenTransaction.commit() verifica se la classe è presente nell’elenco e se è così, non aggiungere.

    Di nuovo, questi 3 metodi di lavoro, ma che dipenderà da app.

    io non posso fare questo a tutti i pulsanti (per disattivare il btn). e sostituire al posto di aggiungere non è una buona scelta perchè sto facendo una operazione di rete su ogni frammento, così mi è costato di più. io aspetto con ansia il 3 ° se non trovare il migliore approccio. grazie

    OriginaleL’autore Dzhuneyt

  5. 0

    Per aggiungere un frammento solo una volta,

    Avete bisogno di controllare ogni volta prima di aggiungere il frammento backstack,
    che se in precedenza è già stato aggiunto o meno. Se si è già aggiunto,
    poi si dovrebbe pop che voce e aggiungere un’altra voce.

    Modo, è possibile eseguire questa operazione utilizzando :

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

    Se fragmentPopped è vero poi c’era un frammento aggiunto backstack e itt è spuntato e si può aggiungere il frammento ora di backstack. È sicuro di chiamata :

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

    Se fragmentPopped è false allora non c’era alcun frammento aggiunto in backstack

    Molto bello informazioni si possono ottenere : qui

    OriginaleL’autore Kushal

  6. 0

    È possibile utilizzare il metodo show() di un frammento di transazione

     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();
        }

    Aggiornato

    L’ho usato. ma non funziona. potete modificare questo controllo, secondo il mio codice. grazie
    Io ho modificato e ho letto qui sopra, come si sta facendo chiamate di rete in modo farà una chiamata di rete solo una volta, quando frammento è creato e, una volta creata, è solo andando a mostrare di volta in volta. Fare rete chiamata in caso di dichiarazione.

    OriginaleL’autore Hulk

Lascia un commento