2013-07-03 83 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

如果您使用API​​16或更新版本,你應該能夠ActivityOptions做到這一點,因爲它似乎OverridePendingTransition僅適用於新創建的活動。在活動生命週期中,您是否擁有上述代碼?的onCreate? – AWT

+0

我擁有它,以便它在兩次活動中的任何一次檢測到滑動時發生,然後它調用此函數。在刷卡時,它會根據需要創建活動,然後通過這個if語句,如果已經創建了它,它仍會經歷這個if語句。 – clifgray

+0

我正在使用API​​ 10和以上 – clifgray

回答

4

正如你所看到的,overridePendingTransition只適用於如果你要顯示一個新的活動(或完成一箇舊的活動)。

前段時間,我在應用程序中創建了一個嚮導樣式部分,用戶需要通過幾個步驟前進或後退才能完成嚮導。每一步都是Activity,應用程序會在每個向前步驟中重新收集信息,或者用戶可以返回任何步驟來糾正某些內容,並且當他返回到最後一步時,此步驟的用戶信息應該仍然存在,避免用戶再次填充內容。

而不是刷卡,我在每一步使用兩個按鈕:返回。但您的情況與此相同,因爲無論使用滑動還是按鈕,您都希望隨時通過動畫轉換更改您的活動。

對於隨時使用轉換,您不能始終保持活動狀態。作爲documentation說,大約overridePendingTransition:startActivity(意向)或完成的口味之一後

立即電話()來指定一個明確的過渡動畫旁邊的執行。

您應該做的事情是保存每個活動中保存的信息,殺死活動,創建一個新活動,然後再次返回信息以恢復新活動。

要保存信息,可以使用與創建新活動相同的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); 
} 

如果您在nextButtonOnClickonBackPressed看,我每次使用overridePendingTransition時間,我之前用finish一行。這讓我確信這個活動在離開時會被殺死,所以我的動畫轉換將始終執行。

然後我保存我的信息,在這Activity該應用程序詢問用戶的用戶名和密碼。因此,在離開前,我們將用戶介紹的內容保存在我們的Intent的Bundle中。

最後,如果用戶離開這一步,然後他回來,在onCreate我們嘗試從的Intent的Bundle(如果有)收回信息。

我希望它能幫助你。

UPDATE

該溶液符合的Activity生命週期,這意味着Activity娛樂是一個過程完全自然的。您正在使用Activity提供的相同工具,如Activity的IntentBundle用於重新創建您的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); 
    }