2016-02-22 20 views
15

Ho un caso d'uso in cui per lo più inizio un'attività con una transizione, ma non è il caso quando lo si apre dal cassetto di navigazione.Come si può sapere se un'attività viene avviata senza transizione?

Per mantenere la transizione regolare, ho un Transition.TransitionListener in cui faccio scattare l'aggiornamento dell'interfaccia utente al termine della transizione.

così ho qualcosa di simile:

public class SomeActivity extends Activity { 

    public void onCreate(Bundle savedInstanceState){ 
     // ... 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
      Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition(); 
      sharedElementEnterTransition.addListener(new Transition.TransitionListener() { 
       // ... 
       @Override 
       public void onTransitionEnd(Transition transition) { 
        doSomeUiUpdating(); 
       } 
      }); 
     } else { // Pre-Lollipop 
      doSomeUiUpdating(); 
     } 
    } 
} 

Questo metodo funziona bene quando si avvia l'attività con l'animazione, ma come faccio a sapere se l'attività è stato avviato senza una transizione in modo che io possa chiamare doSomeUiUpdating()?

Sono sicuro che ci deve essere un metodo semplice in Activity, Window, Transition o da qualche parte che ho trascurato. Non voglio inoltrare sull'attività chiamante per impostare un pacchetto che dice se l'animazione è visualizzata o meno.

+0

I assumerà la sua la stessa logica si dispone (se (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.LOLLIPOP) {doSomeUiUpdating(); ....) prima del codice devi iniziare un'attività – Tasos

+0

e le transizioni sono state aggiunte nell'API 19 (KITKAT) quindi devi controllare prima quello non LOLLIPOP - https://www.youtube.com/watch?v=K3yMV5am-Xo – Tasos

+0

The La cosa è che - come provo a dire nella prima riga - l'attività (anche se su Lollipop +) è più spesso iniziata con la transizione, ma non quando l'utente inizia l'attività dal cassetto di navigazione. –

risposta

4

È possibile provare onTransitionStart di TransitionListener per impostare un valore booleano isAnimationStarted.

public class SomeActivity extends Activity { 

    private boolean isAnimationStarted = false; 

    public void onCreate(Bundle savedInstanceState) { 
     // ... 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
      Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition(); 
      sharedElementEnterTransition.addListener(new Transition.TransitionListener() { 
       // ... 
       @Override 
       public void onTransitionEnd(Transition transition) { 
        doSomeUiUpdating(); 
       } 

       @Override 
       public void onTransitionStarted(Transition transition) { 
        isAnimationStarted = true; 
       } 
      }); 
     } 
    } 

    public void onStart() { 
     if (!isAnimationStarted) { 
      doSomeUiUpdating(); 
     } 
    } 

} 
+0

Soluzione semplice e piacevole. :) –

+0

Ma non creerà un possibile problema - perché la richiamata implica un'esecuzione asincrona, non è possibile che anche se l'animazione è imminente, onStart verrà chiamato prima che venga chiamato onTransitionStarted? – NeverwinterMoon

+1

In effetti, l'ho appena testato ed è stato esattamente come ho detto - nel mio caso, onStart è sempre stato chiamato prima di qualsiasi callback, quindi è AnimationStarted era sempre falso.Quindi, questo metodo certamente non aiuta a determinare se l'attività è stata avviata con/senza transizione. – NeverwinterMoon