17

Le nuove transizioni elemento condiviso funzionano quando utilizzo Fragment 'sostituisce' ma non riesco a farlo funzionare frammento 'aggiungi'. Io uso lo stesso contenitore in entrambi i casi.funziona con FragmentTransaction.replace() ma non funziona con FragmentTransaction.add()

Maggiori dettagli:

Attività - Layout>

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00ffff" 
    android:orientation="vertical" > 

</FrameLayout> 

Sul lancio di attività, aggiungo Fragment1 alla schermata

getFragmentManager().beginTransaction().replace(R.id.container,new TransitionTestFragment1(), "TransitionTestFragment1").commit(); 

Su un evento click per un visualizza nel layout di Fragment1 -> Aggiungo Fragment2 sullo schermo. Ho impostato l'ascoltatore in onCreateView del primo frammento

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
final TransitionSet transitionSet = new TransitionSet(); 
transitionSet.addTransition(new ChangeImageTransform()); 
transitionSet.addTransition(new ChangeBounds()); 
transitionSet.addTransition(new ChangeTransform()); 
transitionSet.setDuration(300); 

View v=inflater.inflate(R.layout.fragment1, null); 
final View image=v.findViewById(R.id.image); 
image.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     setSharedElementReturnTransition(transitionSet); 
     Fragment fragment = new TransitionTestFragment2(); 
     fragment.setSharedElementEnterTransition(transitionSet); 

     FragmentTransaction ft = getFragmentManager().beginTransaction() 
       .replace(R.id.container, fragment) 
       .addToBackStack("transaction") 
       .addSharedElement(image, "MyTransition"); 
     ft.commit(); 

    } 
}); 
return v; 

}

ho questa visualizzazione dell'immagine negli schemi di entrambi i frammenti

<ImageView 
     android:layout_width="300dp" 
     android:layout_height="300dp" 
     android:src="@drawable/ic_launcher" 
     android:transitionName="MyTransition" /> 

Ora, la transizione non funziona se io uso FragmentTransaction.add() per aggiungere il secondo frammento, ma funziona se uso invece FragmentTransaction.replace(). Come posso farlo funzionare con add()? È possibile a tutti?

+0

Anche io sono di fronte a questo problema ... Hai trovato una soluzione? –

risposta

2

Immagino sia perché il nuovo frammento è posizionato sopra il vecchio frammento. Il vecchio frammento non viene posizionato fuori dal controller e non viene chiamato il metodo (e i metodi sequenziati). Non riproduce nessuna transizione perché il vecchio frammento potrebbe ancora essere visibile all'utente (il sistema non lo sa).

Nel mio answer (dove hai commentato) ho aggiunto una transizione di entrata e uscita. Se lo aggiungi, lo fa addirittura animato? In caso contrario, è probabilmente a causa del motivo dichiarato.

+0

No, non si anima quando lo aggiungo secondo la tua risposta. Ho immaginato che sarebbe stata la ragione. Hai qualche idea per una soluzione? In qualsiasi modo potrei fare questo lavoro senza dover ricorrere a cambiare 'aggiungi' a 'sostituisci'? Grazie comunque per la risposta. –

+0

Non lo saprei. Direi che non è possibile dal momento che il sistema è basato sulla "resiving" di una vista. Presumo che tu voglia lasciare tutte le viste nel tuo vecchio frammento così come sono, e 'riutilizzare' una singola vista nel nuovo frammento. Non ho idea di quanto sia complesso il tuo nuovo frammento, altrimenti metterei tutto nel layout del "vecchio" frammento, animandolo io stesso. Ma a volte è meglio fare concessioni (tecniche vs design) e non animare la vista, o avere animazioni fantasiose e nessun 'stack visibile'. Se il vecchio frammento non rimane visibile, perché utilizzare aggiungi e non sostituisci? – ar34z

+1

pensa che non sia possibile. Alla ricerca di una risposta definitiva in modo da poter andare avanti.Motivo per cui non voglio usare la sostituzione è perché il vecchio frammento funziona pesantemente (scaricando una quantità considerevole di dati da visualizzare, ha più viste di scorrimento orizzontale) quando viene inizializzato .. a causa del quale onSaveInstanceState/onRestore .. non è abbastanza regolare .. mentre se uso solo add, tutto funziona senza problemi (poiché nulla viene scaricato dalla memoria principale) –

-1

Non si anima perché il vecchio frammento è ancora presente. Per aggiungere hai bisogno di nascondere il frammento precedente. Ecco l'esempio

per la spinta di:

fragmentTransaction.add(R.id.content, fragment); 
    if (fragments.size() > 0) { 
     UIBaseFragment lastElement = fragments.lastElement(); 
     fragmentTransaction.hide(lastElement); 
    } 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
    fragments.push(fragment); 

poi pop in questo modo

final FragmentManager manager = getChildFragmentManager(); 
    manager.popBackStack(); 
    fragments.pop(); 
+0

Per favore, prova a spiegare il tuo codice, e quel codice non funziona. – extmkv

Problemi correlati