5

Damit der Übergang von gemeinsam genutzten Elementen reibungslos funktioniert, muss ich die schwere Initialisierung auf meine Zielaktivität verschieben. Siehe Code unten:Wie können wir wissen, dass der Übergang von Activity Shared Elements ausgeführt wird?

getWindow().setSharedElementEnterTransition(enterTransition); 
enterTransition.addListener(new Transition.TransitionListener() { 
    @Override 
    public void onTransitionEnd(Transition transition) { 
     init(); 
    } 
}); 

Wenn jedoch diese Aktivität von Deep link oder einem anderen Aktivität gestartet wird, die nicht über Element geteilt. Der Übergang startet nie, daher wird onTransitionEnd() niemals aufgerufen und init() wird nie ausgeführt. In diesem Fall sollte ich sofort nach dem Start der Aktivität init() anrufen.

Wie kann ich wissen, dass der Übergang ausgeführt wird?


EDIT Ich möchte auch nicht eine andere eingeben Übergang, wenn das gemeinsame Element Übergang laufen zur Verfügung steht. Also antworten Sie unten, dass die Verwendung von postponeEnterTransition() nicht für meinen Fall funktioniert.

Antwort

0

Es sieht so aus, als wäre es besser, postponeEnterTransition() in onCreate (oder anderswo) in Ihrer Empfangsaktivität aufzurufen, alle heavy init() nach diesem Aufruf zu implementieren und den Übergang durch expliziten Aufruf von startPostponedEnterTransition() zu beenden Init ist fertig. Falls kein gemeinsamer Übergang zum Starten der Aktivität erforderlich ist, wie DeepLink und so weiter, wird dies ohne Verzögerung direkt zu Ihrer schweren Initialisierung gehen.

Hier ist der Code:

Aktivität A - beginnt freigegebene Übergangselement

Intent ActivityDemoOneBIntent = new Intent(ActivityDemo1A.this, ActivityDemo1B.class); 
String transitionName = getString(R.string.activityTransitionName); 
Bundle optionsBundle = getTransitionOptionsBundle(imageViewAnimated, transitionName); 
startActivity(ActivityDemoOneBIntent, optionsBundle); 

Aktivität B - "empfängt" shared Element Übergang

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_demo_1_b); 
    postponeTransition(); // postpone shared element transition until we release it explicitly 

    // Do all heavy processing here, activity will not enter transition until you explicitly call startPostponedEnterTransition() 

    // all heavy init() done 
    startPostponedTransition() // release shared element transition. This can be placed to your listeners as well. 
} 

private void postponeTransition() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     postponeEnterTransition(); 
    } else { 
     ActivityCompat.postponeEnterTransition(this); 
    } 
} 

private void startPostponedTransition() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     startPostponedEnterTransition(); 
    } else { 
     ActivityCompat.startPostponedEnterTransition(this); 
    } 
} 
Verwandte Themen