scambiare frammento in un'attività tramite animazione


94

Voglio scambiare due frammenti in un'attività tramite animazione. Supponiamo che PaginaA sia per il frazionamento A e il lato sinistro dello schermo e PaginaB sia per il frammento B, cioè sul lato destro dello schermo. Ora voglio che quando faccio clic su un pulsante sulla paginaA, la paginaA si sposta sul lato destro dello schermo con un'animazione di transizione.

Ho provato il codice seguente per sostituire la posizione

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Alla ricerca di qualche indizio.

Grazie in anticipo.


Risposte:


282

Vecchia domanda e probabilmente l'hai già capito, ma per riferimento futuro:

ecco cosa usi per impostare un'animazione personalizzata quando sostituisci un frammento tramite codice:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Ecco un esempio dell'animazione slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Nota che questa è l'animazione se stai usando la libreria di compatibilità. Se invece utilizzi un SDK con supporto nativo per FragmentManager, la tua animazione sarà simile a questa:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Questo perché la libreria di compatibilità non supporta il nuovo tipo objectAnimator e implementa invece solo il vecchio framework di animazione.


92
Questa è sicuramente la risposta giusta. Nota che l'ordine è importante! È necessario disporre della chiamata setCustomAnimations () prima delle chiamate di aggiunta / sostituzione!
theelfismike

2
Quindi quale approccio dovresti usare se vuoi la migliore composizione?
K - La tossicità in SO sta crescendo.

17
Queste diverse animazioni non sono esattamente uguali. Stai assumendo che la larghezza del tuo frammento sia uguale a 1280 usando un valueFrom di -1280. Se la larghezza fosse maggiore, non inizierà completamente fuori dallo schermo.
egfconnor

51
Puoi invece utilizzare le animazioni predefinite dallo spazio dei nomi Android: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy

2
Le animazioni predefinite attivano un'eccezione runtime, FWIW, perché si basano sul tag "translate".
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.