42

Utilizzo la libreria di compatibilità Android v4 per sviluppare un'interfaccia utente di tablet utilizzando frammenti specifici per dispositivi Android 2.2 e versioni successive.Transizione standard frammento non animato

Tutto funziona come dovrebbe, tranne che non riesco a far funzionare le animazioni, nemmeno le animazioni standard.

Codice:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    ABCFragment abcFragment = new ABCFragment(); 
    ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);  
    ft.addToBackStack(null); 
    ft.commit(); 

Invece di usare un'animazione di transito, il frammento si blocca per circa un secondo e il giusto scompare e appare la nuova.

Usando:

ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right); 

non funziona neanche.

XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res/com.synergygb.mycustomapp" 
android:id="@+id/LinearLayout01" android:layout_width="fill_parent" 
android:layout_height="fill_parent" android:orientation="vertical" 
android:gravity="bottom"> 
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_frame_layout_fragment_holder"> 
</FrameLayout> 
<!-- OTHER FIXED UI ELEMENTS--> 
</RelativeLayout> 

Ho letto che l'animazione personalizzato erano rotti nella libreria di compatibilità, ma nessuno sembra avere problemi con le transizioni standard. Ho provato questo su una 3.2.1 Motorola Xoom, Galaxy Tab 2.3 7" , 2,2 emulatore, e anche su un HTC G2 con 2.3.4.

cosa potrebbe essere sbagliato?

+0

Dalvik (debugger) ti sta dando qualcosa? – IAmYourFaja

+0

Avete qualche output di logcat da darci? –

+0

Niente, questo è il motivo per cui ho perso. Nessun errore Logcat non mostra nulla. Solo normali richiamate del sistema, niente relative alle modifiche in-app in corso. Controllare il valore di mTransition che dà = 4099. Questo valore è impostato da: ft.setTransition (FragmentTransaction.TRANSIT_FRAGMENT_FADE); – blindstuff

risposta

35

ho finalmente ottenuto questo. lavorare dopo molte prove ed e rror.

Prima di tutto, ottenere l'ultimo ACL, ha risolto le animazioni personalizzate, e mentre questo non era il mio problema esatto, una volta che hanno funzionato ho finito per usarle invece delle transizioni standard.

In questo momento im utilizzando:

ft.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out); 

La chiave per farlo funzionare sia su Android 2.1, 2.2 e 2.3, così come Android 3.0+ è stato quello di effettuare le seguenti operazioni:

  • Marchio Sicuramente stai utilizzando SOLO le API disponibili per il livello di API più basso che desideri supportare (nel mio caso 2.1).
  • Compilare utilizzando Android 3.0.
  • Nel file manifest, impostare android:hardwareAccelerated="true" all'interno del tag dell'applicazione.

Le animazioni di frammenti ora funzionano su tutti i dispositivi. Se non si impostano le informazioni aggiuntive nel tag dell'applicazione, l'animazione si arriverà, ma in un modo molto molto agitato, facendo sembrare che non si sia verificato affatto.

Spero che questo aiuti qualcuno in futuro!

Come nota, ci sono alcuni strumenti di verifica dell'API in modo da essere sicuri di non utilizzare alcuna API non disponibile. Preferisco lavorare su 2.1 così l'IDE non mostra nulla che non posso usare, una volta che ho il codice stabile torno alla compilazione su 3.0

+0

Grazie per questa risposta, sto testando su un SII, HTC Evo, Nexus Galaxy e un SIII ed è stato orribile vedere il Nexus ritardare le animazioni, con il tag hardware che si comporta come previsto :) – Goofyahead

+0

@blindstuff Se non lo sei utilizzando qualsiasi codice in un livello API superiore al più basso che stai supportando, non è necessario compilare una nuova API. L'unica cosa che compila su una nuova API ti dà accesso a nuove classi e metodi. –

+2

È necessario compilare in 3.0 o precedente per avere 'android: hardwareAccelerated = "true" 'riconosciuto. – blindstuff

32

Prova ad ottenere il più ACL recente ancora una volta, hanno riparato: http://code.google.com/p/android/issues/detail?id=15623#c19

Inoltre ho notato che per setCustomAnimations, deve essere impostata prima operazione prevede come sostituire in modo da entrare in vigore

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.setCustomAnimations(R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left); 
ft.replace(android.R.id.content, newFrag); 
ft.addToBackStack(null); 
ft.commit(); 
+0

Ho fatto entrambe le cose che descrivi, l'ho affermato nei commenti per dare seguito alla mia domanda. L'ho già fatto funzionare, ma sto solo testando prima di dare una risposta che non sono sicura al 100%. Ho avuto modo di lavorare con il Galaxy Tab, sul XOOM le animazioni sembrano schifo. – blindstuff

+0

scusate, non ho potuto commentare il post di altre persone (non abbastanza reputazione). Sono contento di sentirti risolto! – dvd

+0

Grazie per il tuo aiuto, + 1'ed, è stato utile usare 'ft.setCustomAnimations (R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left);' invece di solo 'ft.setCustomAnimations (R.anim.in_from_left, R.anim.out_to_right);' – blindstuff

0

Spero che questo aiuti qualcuno. I documenti API dicono use objectAnimator per le animazioni dei frammenti, ma anche con l'ultimo pacchetto di compatibilità objectAnimator in xml non è stato accettato dal compilatore.

questo funziona per me:

Per Android 3.0 o superiore: dichiarare xml objectAnimator nella cartella res/animatore.

Con pacchetto di compatibilità inferiore a 3.0: dichiarare l'animazione xml nella cartella res/anim.

3

per eseguire l'animazione top_to_bottom per frammento,

seguono lo stesso di fare verso il basso

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.setCustomAnimations(R.anim.top_to_bottom_fragment, 
android.R.animator.fade_out); ft.replace(R.id.simple_fragment, 
fragment); 
ft.commit(); 

top_to_bottom_fragment.xml

<objectAnimator android:duration="400" android:valueFrom="-800" 
    android:valueTo="0" android:propertyName="y" 
    android:valueType="floatType" 
    xmlns:android="http://schemas.android.com/apk/res/android" /> 

dove valueFrom="-800" indicano fondo del layout frammento.

2

È necessario chiamare setCustomAnimationsprima del aggiungere il frammento. Ciò consente di aggiungere più frammenti con animazioni diverse.

Problemi correlati