web-dev-qa-db-ja.com

FLAG_ACTIVITY_REORDER_TO_FRONTが使用されている場合、overridePendingTransitionは機能しません

スタックに2つのアクティビティがあります。それらを表示するには、FLAG_ACTIVITY_REORDER_TO_FRONTを使用します。これまでのところ問題は、overridePendingTransitionを使用してアニメーションでアクティビティを取得したい場合に発生します。

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);

遷移は表示されませんが、フラグがインテントに追加されていない場合(行2を削除)、問題はありません。

アニメーションでアクティビティを前面に出すことは可能ですか?

どうもありがとう!

27
Daniel

REORDER_TO_FRONTを使用する場合の実際の正しい解決策は、開くアクティビティのメソッドonNewIntent()でoverridePendingTransitionを呼び出すことです。

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

トランジションに置き換えます。

トランジションを選択的に置き換える必要がある場合は、インテントにエクストラを追加し、それをonNewIntent()で確認して、何をするかを決定できます。

これは、開かれるトランジションがわからない場合(たとえば、明示的に指定しない場合)には適していませんが、それ以外の場合は適切なソリューションです。

38
Daniele Segato

私はこれと同じ問題に遭遇しました。コツは、onResume()コールバックの遷移をオーバーライドすることです。

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

私にとって、解決策はそれがUIスレッドで実行されることを確認することでした

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();
4
K-RAD

呼び出す

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

終了後();クロージング活動の私のために働いた。

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

これは、onResumeを呼び出すよりも優れています。これにより、アクティビティの開始アニメーションと終了アニメーションの独立性が高まるためです。


送信者のアクティビティの終了後の呼び出し:

アクティビティA ---遷移1に入る(A)--->アクティビティB ---遷移2に入る(B)--->アクティビティC

アクティビティA <---終了遷移1(on B)---アクティビティB <---終了遷移2(on C)---アクティビティC

アクティビティA ---遷移1に入る(A)--->アクティビティC ---遷移3に入る(C)--->アクティビティB

アクティビティA <---終了遷移3(on C)---アクティビティC <---終了遷移2(on B)---アクティビティB



レシーバーアクティビティのonResumeを呼び出す:

アクティビティA ---遷移1に入る(B)--->アクティビティB ---遷移2に入る(C)--->アクティビティC

アクティビティA <---遷移1に入る(A)---アクティビティB <---遷移2に入る(B)---アクティビティC

アクティビティA ---遷移3に入る(C)--->アクティビティC ---遷移2に入る(B)--->アクティビティB

アクティビティA <---遷移1に入る(A)---アクティビティC <---遷移3に入る(C)---アクティビティB

ここで、onResumeアニメーションは、それがどの送信者アクティビティであっても常に同じである必要があります。代わりに、アニメーションを簡単にカスタマイズできる最初のアプローチです。

2

同じ問題が発生しました。 AndroidManifest.xmlをチェックして、ActivityAとActivityBの両方が設定されていないことを確認することをお勧めしますTheme.Translucent.NoTitleBar、このテーマには「Android:windowIsTranslucent」= trueが含まれているため、問題が発生します。

これがお役に立てば幸いです。

2
huangxin

私の同僚がこの問題に遭遇し、最小のSDK属性(5以上)を追加することで問題を解決することができました。

この機能はapi 5以降で利用可能だったため、より高いsdkレベルの使用を強制するとうまくいきました。

1
Royi Benyossef

2番目のアクティビティのonCreate()またはonStart()でアニメーションを作成してみませんか。

0
GSree