4

私は 2 つのアクティビティを持っており、単純なスライドを行ったり来たりして、2 つのアクティビティ間を移行します。次のコードでは、overridePendingTransition を使用して初めて問題なく動作しますが、アクティビティが既に作成された後はそのメソッドが機能せず、アプリがアクティブである間ずっとこれら 2 つを維持しています。アクティビティが作成されて生きた後でも機能する、ここに入れることができる方法はありますか?

//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);
          }

私のアニメーションは正しく動作し、現在のアクティビティを保持し、新しいアクティビティを左から持ってくるだけです。

4

2 に答える 2

4

これまで見てき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 行使用します。これにより、終了時にこのアクティビティが強制終了されるため、アニメーションの遷移が常に実行されます。overridePendingTransitionfinish

次に、情報を保存します。これActivityで、アプリはユーザーにユーザー名とパスワードを要求します。したがって、終了する前に、ユーザーによって導入されたものを Intent に保存しますBundle

最後に、ユーザーがこのステップを離れて戻ってきた場合、 でインテント(ある場合)onCreateから情報を取り戻そうとします。BundlerestoreRegistrationValues

お役に立てば幸いです。

アップデート

このソリューションはライフサイクルに準拠していActivityます。つまり、Activityレクリエーションは完全に自然なプロセスです。ActivityアクティビティIntentBundleを再作成するなど、が提供する同じツールを使用していますActivity。さらに、長期間使用されていない場合、アクティビティが破棄される可能性があることを考慮する必要があります。ドキュメントが言うように:

アクティビティが現在停止していて長期間使用されていない場合、またはフォアグラウンド アクティビティがより多くのリソースを必要とするため、システムがバックグラウンド プロセスをシャットダウンしてメモリを回復する必要がある場合、システムはアクティビティを破棄することもあります。

同様に、Activityがローテーションされた場合でも が破棄され、その値を保存して復元し、新しい を再作成する必要がありますActivity

必要に応じて、この解決策にまだ不安を感じている場合は、時間をかけて詳細を確認してください.

于 2013-07-08T22:33:53.993 に答える
0

もっと簡単な解決策があります!それは私にとって素晴らしい働きをしました!私がしたことは、条件を使用してが真か偽ifかを伝えることです。overridePendingTransition onPause();次のように入力します。

    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);
    }
于 2013-09-13T20:08:56.803 に答える