2011-01-08 7 views
23

Ich habe zwei Aktivitäten im Stapel, um ihnen zu zeigen, dass ich FLAG_ACTIVITY_REORDER_TO_FRONT verwende. So weit so gut, kommt das Problem, wenn ich die Aktivität mit einer Animation mit overridePendingTransition bringen will.overridePendingTransition funktioniert nicht, wenn FLAG_ACTIVITY_REORDER_TO_FRONT verwendet wird

Intent i = new Intent(ActivityA.this, ActivityB.class); 
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
ActivityA.this.startActivity(i); 
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 

Der Übergang nicht dargestellt ist, jedoch, wenn das Flag nicht dann dort an die Absicht (Entfernen von Linie 2) zugegeben wird, ist kein Problem.

Ist es möglich, eine Aktivität mit einer Animation nach vorne zu bringen?

Vielen Dank!

Antwort

0

Wie erstellt man Animation in der onCreate() oder onStart() der zweiten Aktivität.

+0

Hmm ... klingt nach einer guten Idee! Danke vielmals. Ich werde lernen, mit Animationen umzugehen und das zu versuchen. – Daniel

+0

@Daniel überprüfen APIDemos (mit Android-Framework zur Verfügung gestellt) com.example.android.apis.animation.Rotation3dAnimation.java und wie es in Transition3D.java verwendet wird. Sollte dir einen guten Einblick geben. – GSree

+0

Danke GSree für Ihre Hilfe! Ich habe versucht, eine Slide-Out-Animation in der onPause() von Aktivität A und ein Einschlafen in der onResume() von Aktivität B zu starten. Es war eine nette Idee, und es funktioniert, aber es ist nicht glatt genug Sie sehen eine Art schwarzes Blinken, weil die Animationen nicht gleichzeitig ausgeführt werden. Ich arbeite weiter daran, wenn ich eine gute Lösung finde, werde ich es wissen lassen. – Daniel

1

Mein Kollege ist auf dieses Problem gestoßen und hat es gelöst, indem er das SDK-Mindestattribut (5 und älter) hinzugefügt hat.

da diese funktion seit api 5 verfügbar war, hat die erzwingung der nutzung eines höheren sdk-levels den spaß für uns gebracht.

34

Ich stieß auf das gleiche Problem. Der Trick besteht darin, den Übergang im onResume() - Callback zu überschreiben.

@Override 
public void onResume() { 
    super.onResume(); 
    overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 
} 
+0

, indem Sie es in onResume() tun. Der Effekt ist überhaupt nicht glatt, wenn die erste Aktivität an die Spitze gebracht wird, es erscheint mit einem Ruck – Ravi

+0

das funktioniert für mich, wenn ich eine neue Aktivität aus dem Dienst starte, und die ausstehende Transaktion überschreiben muss! – cwhsu

+2

Dieser Vorschlag ist nicht korrekt. onResume wird bei vielen Gelegenheiten aufgerufen, die nichts mit einer neuen Absicht zu tun haben. Die richtige Lösung ist diejenige, auf die ich hingewiesen habe: tue es in onNewIntent() Methode –

31

Tatsächlich ist die richtige Lösung, wenn REORDER_TO_FRONT Verwendung ist overridePendingTransition im Verfahren onNewIntent() der Aktivität rufen Sie öffnen wollen.

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 
} 

Ersetzen Sie mit Ihren Übergängen.

Wenn Sie den Übergang selektiv ersetzen müssen, können Sie ein Extra in Ihre Absicht einfügen und im onNewIntent() überprüfen, was zu tun ist.

Dies ist nicht geeignet, wenn Sie den zu öffnenden Übergang nicht kennen (wenn Sie ihn nicht explizit angeben), aber ansonsten die richtige Lösung ist.

+6

Die einzige richtige Lösung. Sollte als Antwort angenommen werden. – tomrozb

+0

Ich wünschte, ich weiß, warum einige Leute meine Antwort abgelehnt haben, das ist, wie tomrozb sagte, die einzig richtige Lösung –

-2

Ich habe etwas ähnliches und ich habe wie folgt:

private Stack<String> stack; 
ViewAnimator mViewAnimator; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mViewAnimator = new ViewAnimator(this); 
    if (stack == null) stack = new Stack<String>(); 
    push("FirstStackActivity", new Intent(this, FirstStackActivity.class)); 
} 

@Override 
public void finishFromChild(Activity child) { 
    pop(); 
} 

@Override 
public void onBackPressed() { 
    pop(); 
} 

public void push(String id, Intent intent) { 
    Window window = getLocalActivityManager().startActivity(id, intent); 
    if (window != null) { 
     stack.push(id); 
     View view = window.getDecorView(); 
     mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in)); 
     mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));    
     mViewAnimator.addView(view); 
     mViewAnimator.showNext(); 
     setContentView(mViewAnimator); 
    } 
} 

public void pop() { 
    if (stack.size() == 1) finish(); 
    if (stack.size() > 0) { 
     LocalActivityManager manager = getLocalActivityManager(); 
     Intent lastIntent = manager.getActivity(stack.peek()).getIntent(); 
     Window newWindow = manager.startActivity(stack.peek(), lastIntent); 
     View view = newWindow.getDecorView(); 
     mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in)); 
     mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out)); 
     mViewAnimator.showPrevious(); 
     mViewAnimator.removeView(view); 
    } 
    destroy(stack.pop()); 
} 


/** 
* BugFix official 
* @param id 
* @return 
*/ 
public boolean destroy(String id) { 
    final LocalActivityManager activityManager = getLocalActivityManager(); 
    if (activityManager != null) { 
     activityManager.destroyActivity(id, false); 
     try { 
      final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities"); 
      if (mActivitiesField != null) { 
       mActivitiesField.setAccessible(true); 
       @SuppressWarnings("unchecked") 
       final Map<String, Object> mActivities = (Map<String, Object>) mActivitiesField.get(activityManager); 
       if (mActivities != null) { 
        mActivities.remove(id); 
       } 
       final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray"); 
       if (mActivityArrayField != null) { 
        mActivityArrayField.setAccessible(true); 
        @SuppressWarnings("unchecked") 
        final ArrayList<Object> mActivityArray = (ArrayList<Object>) mActivityArrayField.get(activityManager); 
        if (mActivityArray != null) { 
         for (Object record : mActivityArray) { 
          final Field idField = record.getClass().getDeclaredField("id"); 
          if (idField != null) { 
           idField.setAccessible(true); 
           final String _id = (String) idField.get(record); 
           if (id.equals(_id)) { 
            mActivityArray.remove(record); 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 
    return false; 
} 
2

Aufruf
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 

nach finish(); der abschließenden Aktivität hat für mich gearbeitet.

finish(); 
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left); 

Es ist besser als onResume nennen, weil sie die Tätigkeit unabhängiger über die Animationen betreten und verlassen macht:


Aufruf nach Tätigkeit beenden Absender:

A Aktivität --- Geben Sie Übergang 1 (auf A) ---> Aktivität B --- Übergang 2 eingeben (auf B) ---> Aktivität C

Aktivität A < --- Exit Transition 1 (auf B) --- Aktivität B < --- Übergang 2 beenden (an C) --- Aktivität C

Aktivität A --- Übergang 1 (auf A) eingeben ---> Aktivität C --- Übergang 3 eingeben (auf C) - -> Aktivität B

Aktivität A < --- Beenden Transition 3 (auf C) --- Aktivität C < --- Ausfahrt Transition 2 (auf B) --- Aktivität B



Anreagieren der Empfängeraktivität:

Aktivität A --- Übergang 1 eingeben (auf B) ---> Aktiv B - Übergang 2 eingeben (an C) ---> Aktivität C

Aktivität A < --- Übergang 1 (an A) eingeben --- Aktivität B < --- Übergang 2 eingeben (an B) --- C Aktivität

Aktivität A --- eingeben Transition 3 (auf C) ---> C Aktivität --- eingeben Transition 2 (auf B) ---> B Aktivität

Aktivität A < --- Übergang 1 eingeben (an A) --- Aktivität C < --- Übergang 3 eingeben (an C) --- Aktivität B

Hier muss die onResume-Animation immer gleich sein, egal welche Senderaktivität es ist, stattdessen der erste Ansatz, wo Sie die Animation leicht anpassen können.

2

für mich war die Lösung sicherzustellen, dass es in dem UI-Thread Rans

runOnUiThread(new Runnable() { 
      public void run() { 
       startActivity(new Intent(ActivityOne.this, ActivityTwo.class)); 
       overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 
      } 
     }); 

     finish(); 
+0

in meinem Fall, das war genau mein Fehler –

1

ich das gleiche Problem. Ich schlage vor, Sie überprüfen AndroidManifest.xml, um sicherzustellen, dass ActivityA und ActivityB beide keinen Satz haben Theme.Translucent.NoTitleBar, enthält dieses Thema "android: windowIsTranslucent" = true verursachen das Problem.

Ich hoffe, dies hilft Ihnen.