正如你所看到的,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);
}
如果您在nextButtonOnClick
和onBackPressed
看,我每次使用overridePendingTransition
時間,我之前用finish
一行。這讓我確信這個活動在離開時會被殺死,所以我的動畫轉換將始終執行。
然後我保存我的信息,在這Activity
該應用程序詢問用戶的用戶名和密碼。因此,在離開前,我們將用戶介紹的內容保存在我們的Intent的Bundle
中。
最後,如果用戶離開這一步,然後他回來,在onCreate
我們嘗試從的Intent的Bundle
(如果有)收回信息。
我希望它能幫助你。
UPDATE
該溶液符合的Activity
生命週期,這意味着Activity
娛樂是一個過程完全自然的。您正在使用Activity
提供的相同工具,如Activity的Intent
和Bundle
用於重新創建您的Activity
。此外,你應該考慮如果你的活動很長時間沒有使用過,它們可能會被破壞。作爲documentation說:
該系統還可以摧毀你的行爲,如果它現在停止,並沒有在很長一段時間被使用或前景活動需要更多的資源,因此係統必須關閉後臺進程以恢復內存。
以同樣的方式,甚至當你的Activity
旋轉時,也毀了,你將需要保存和恢復它的值,並重新創建一個新的Activity
。
如果您願意,請花些時間瞭解更多,如果您仍對此解決方案感到不舒服。
如果您使用API16或更新版本,你應該能夠ActivityOptions做到這一點,因爲它似乎OverridePendingTransition僅適用於新創建的活動。在活動生命週期中,您是否擁有上述代碼?的onCreate? – AWT
我擁有它,以便它在兩次活動中的任何一次檢測到滑動時發生,然後它調用此函數。在刷卡時,它會根據需要創建活動,然後通過這個if語句,如果已經創建了它,它仍會經歷這個if語句。 – clifgray
我正在使用API 10和以上 – clifgray