これまで見てきoverridePendingTransition
たように、新しいアクティビティを表示する (または古いアクティビティを終了する) 場合にのみ機能します。
少し前に、ユーザーがウィザードを完了するためにいくつかの手順を進めたり戻したりする必要があるアプリで、ウィザード スタイルのセクションを作成しました。各ステップはActivity
であり、アプリは前進するすべてのステップで情報を再収集します。または、ユーザーは任意のステップに戻って何かを修正し、最後のステップに戻ったときに、このステップのユーザー情報がまだそこにある必要があり、ユーザーを回避します再び何かを満たすこと。
スワイプの代わりに、各ステップで 2 つのボタンを使用します: go と back です。ただし、スワイプまたはボタンを使用する場合でも、いつでもアニメーション遷移でアクティビティを変更したいため、ケースはこれと同じです。
トランジションをいつでも使用するために、アクティビティを常に有効にしておくことはできません。ドキュメントが次のように述べているようにoverridePendingTransition
:
startActivity(Intent) または finish() のフレーバーのいずれかの直後に呼び出して、次に実行する明示的な遷移アニメーションを指定します。
あなたがしなければならないことは、保存されたすべてのアクティビティで取得された情報を保持し、アクティビティを強制終了し、新しいアクティビティを作成し、情報を元に戻して新しいアクティビティを復元することです。
情報を保存するには、Intent
新しいアクティビティを作成するために使用しているものと同じものを使用できます。情報を預けることがBundle
できる場所があります。
例えば:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_step_one_register_wizard);
// Get the components of the content layout
usernameEditText = (EditText)findViewById(R.id.usernameEditText);
passwordEditText = (EditText)findViewById(R.id.passwordEditText);
// Get the registration values which are in the extras of the current Intent (if any)
restoreRegistrationValues();
}
/** Used to show the registration values which are in the extras of the current Intent */
private void restoreRegistrationValues() {
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
if (bundle != null) {
usernameEditText.setText(bundle.getCharSequence(Constants.KEY_USERNAME_TEXT));
passwordEditText.setText(bundle.getCharSequence(Constants.KEY_PASSWORD_TEXT));
}
}
/** Called when the user presses the Next button */
public void nextButtonOnClick(View view) {
finish();
overridePendingTransition(R.anim.right_to_left, R.anim.left_to_right);
Intent intent = this.getIntent();
intent.setClass(this, StepTwoOneRegisterWizardActivity.class);
intent.putExtra(Constants.KEY_USERNAME_TEXT, usernameEditText.getText());
intent.putExtra(Constants.KEY_PASSWORD_TEXT, passwordEditText.getText());
startActivity(intent);
}
/** Called when the user presses the Back button */
public void backButtonOnClick(View view) {
onBackPressed();
}
@Override
/** Called when the user presses the Back hard button */
public void onBackPressed() {
finish();
overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
Intent intent = this.getIntent();
intent.setClass(this, StepZeroRegisterWizardActivity.class);
intent.putExtra(Constants.KEY_USERNAME_TEXT, usernameEditText.getText());
intent.putExtra(Constants.KEY_PASSWORD_TEXT, passwordEditText.getText());
startActivity(intent);
}
と が表示されている場合nextButtonOnClick
、を使用onBackPressed
するたびに、前に 1 行使用します。これにより、終了時にこのアクティビティが強制終了されるため、アニメーションの遷移が常に実行されます。overridePendingTransition
finish
次に、情報を保存します。これActivity
で、アプリはユーザーにユーザー名とパスワードを要求します。したがって、終了する前に、ユーザーによって導入されたものを Intent に保存しますBundle
。
最後に、ユーザーがこのステップを離れて戻ってきた場合、 でインテント(ある場合)onCreate
から情報を取り戻そうとします。Bundle
restoreRegistrationValues
お役に立てば幸いです。
アップデート
このソリューションはライフサイクルに準拠していActivity
ます。つまり、Activity
レクリエーションは完全に自然なプロセスです。Activity
アクティビティIntent
やBundle
を再作成するなど、が提供する同じツールを使用していますActivity
。さらに、長期間使用されていない場合、アクティビティが破棄される可能性があることを考慮する必要があります。ドキュメントが言うように:
アクティビティが現在停止していて長期間使用されていない場合、またはフォアグラウンド アクティビティがより多くのリソースを必要とするため、システムがバックグラウンド プロセスをシャットダウンしてメモリを回復する必要がある場合、システムはアクティビティを破棄することもあります。
同様に、Activity
がローテーションされた場合でも が破棄され、その値を保存して復元し、新しい を再作成する必要がありますActivity
。
必要に応じて、この解決策にまだ不安を感じている場合は、時間をかけて詳細を確認してください.