2013-07-03 2 views
3

У меня есть два действия, и я перехожу между ними, выполняя простой слайд назад и вперед. Со следующим кодом, который работает очень хорошо в первый раз, используя overridePendingTransition, но этот метод не работает после того, как активность уже создана, и я сохраняю их всех в течение всего времени, когда приложение активно. Есть ли способ, который я могу включить здесь, который работает даже после того, как действия созданы и живы?Моя анимация перехода на Android работает только один раз

//checking if this is the correct activity to make sure I don't start up the same one 
if (_thisActivity.GetType() == typeof(FeedActivity)) 
     { 
     this._baseActivity.OverridePendingTransition(Resource.Animation.LeftToRight, Resource.Animation.Hold); 
     } 
//checking if it is the other type 
if (_thisActivity.GetType() == typeof(ListActivity)) 
      { 
      this._baseActivity.OverridePendingTransition(Resource.Animation.RightToLeft, Resource.Animation.Hold); 
      } 

Моя анимация работает правильно и просто имеет его удержать текущую деятельность, где она и приносит новый с левого.

+0

Если вы используете API16 или более поздней версии, вы должны быть в состоянии сделать это с ActivityOptions, так как кажется, OverridePendingTransition только для вновь созданных мероприятий. Где в жизненном цикле деятельности у вас есть код выше? OnCreate? – AWT

+0

У меня это так, что он обнаруживает в любое время в любом из двух действий, когда выполняется салфетка, а затем вызывает эту функцию. После прокрутки он создает активность, если это необходимо, и затем проходит через этот оператор if, и если он уже создан, он все еще проходит через этот оператор if. – clifgray

+0

И я использую API 10 и до – clifgray

ответ

4

Как вы видели, 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.

Пожалуйста, если вы хотите, не торопитесь, чтобы узнать больше, если вы чувствуете себя неудобно с этим решением.

+0

Спасибо, что очень полезно. Не существует способа сохранить их жизнь и сделать переход между ними, это хорошее решение, но похоже, что это будет гораздо проще. На самом деле это не вариант для меня, но мне, возможно, придется перепроектировать приложение. – clifgray

+0

Я оставил вам обновление. –

+0

Наконец-то он заработал, спасибо! – clifgray

0

У меня есть еще более простое решение! Это работало потрясающе для меня! Что я сделал, так это то, что я использовал условие if, чтобы сказать, было ли значение overridePendingTransitiononPause(); истинным или ложным. Тип этого:

boolean anim = true; // make a boolean 'anim' 
    ... 
    public void backButtonOnClick(View view) { 
     onBackPressed(); 
} 

@Override 
public void onBackPressed() { 
      super.onPause(); 
      finish(); 
      if (anim) { 
       overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left) //If boolean 'anim' is true, play these animations 
      } 
    ... 
    public void nextButtonOnClick(View view) { 
     finish(); 
    anim = false; //make 'anim' false so that it isn't used again 
    overridePendingTransition(R.anim.right_to_left, R.anim.left_to_right); //play these animations now 
    startActivity(yourIntentToNextActivity); 
    }