Как вы видели, overridePendingTransition
работает только в том случае, если вы собираетесь показать новое действие (или завершить старое).
Некоторое время назад я создал раздел стиля мастера в приложении, где пользователю нужно пройти вперед или назад, пройдя несколько шагов, чтобы завершить работу мастера. Каждый шаг - Activity
, и приложение запоминает информацию на каждом шаге вперед, или пользователь может вернуться к любым шагам, чтобы что-то исправить, и когда он вернется к последнему шагу, он должен был все еще там, чтобы избежать пользователь снова заполнит что-то.
Вместо салфетки, я использую две кнопки на каждом шаге: идти и обратно. Но ваш случай тот же, что и этот, потому что независимо от того, используете ли вы салфетки или кнопки, вы хотите в любой момент изменить свои действия с помощью перехода анимации.
Чтобы использовать переход в любое время, вы не можете постоянно поддерживать свои активности. Как documentation говорит о overridePendingTransition
:
вызова сразу после того, как один из ароматов startActivity (Intent) или финишных(), чтобы определить явный переход анимацию для выполнения следующего.
То, что вам нужно сделать, это сохранить информацию, полученную при каждом сохраненном действии, убить действие, создать новый и снова вернуть информацию для восстановления нового действия.
Для того чтобы сохранить информацию, вы можете использовать тот же самый 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
, каждый раз, когда я использую overridePendingTransition
, я использую finish
одну строку раньше. Это позволяет мне убедиться, что эта активность будет убита при выходе, поэтому мой переход анимации будет выполняться всегда.
Затем я сохраняю свою информацию, в этом Activity
приложение запрашивает у пользователя имя пользователя и пароль. Таким образом, перед отъездом мы сохраняем введенный пользователем в нашем Intent Bundle
.
И наконец, если пользователь покинет этот шаг, а затем вернется, в onCreate
мы попытаемся вернуть информацию с Bundle
(если есть) в Intent в restoreRegistrationValues
.
Надеюсь, это вам поможет.
ОБНОВЛЕНИЕ
Это решение соответствует Activity
жизненного цикла, что означает Activity
отдыха представляет собой процесс, вполне естественно. Вы используете те же инструменты, которые предоставляются Activity
, например, Intent
и Bundle
для воссоздания вашего Activity
. Кроме того, вы должны учитывать, что ваши действия могут быть уничтожены, если они не использовались в течение длительного времени. Как documentation говорит:
Система также может уничтожить вашу деятельность, если она в настоящее время остановлена и не используется в течение длительного времени или на переднем плане деятельность требует больше ресурсов, поэтому система должна закрыть фоновые процессы для восстановления памяти.
Точно так же, даже если ваш Activity
вращается, также разрушен, и вам нужно будет сохранять и восстанавливать свои ценности, и воссоздать новый Activity
.
Пожалуйста, если вы хотите, не торопитесь, чтобы узнать больше, если вы чувствуете себя неудобно с этим решением.
Если вы используете API16 или более поздней версии, вы должны быть в состоянии сделать это с ActivityOptions, так как кажется, OverridePendingTransition только для вновь созданных мероприятий. Где в жизненном цикле деятельности у вас есть код выше? OnCreate? – AWT
У меня это так, что он обнаруживает в любое время в любом из двух действий, когда выполняется салфетка, а затем вызывает эту функцию. После прокрутки он создает активность, если это необходимо, и затем проходит через этот оператор if, и если он уже создан, он все еще проходит через этот оператор if. – clifgray
И я использую API 10 и до – clifgray