1

アクティビティ A と B の間でユーザー データを維持する必要があるウィザード スタイルのアプリケーションを作成しています。A には [Next] ソフト ボタンがあり、B には [Back] ソフト ボタンがあります。

FLAG_ACTIVITY_REORDER_TO_FRONT各アクティビティが再利用されるため、ソフト ボタンを使用すると、ユーザー データを有効に保つことができます。

しかし、ユーザーが B から Back ハード ボタンを押すと、そのハード ボタンが暗黙的に finish() を使用するため、B は終了します。

次に、B でオーバーライドonBackPressedして、Back ソフト ボタンと同じ動作を追加して、Back ハード ボタンが前のボタンとまったく同じように動作すると考えました (B を終了しない)。

これで、Back ハードキーで B から A に戻れば問題ありません。この時点で A にフォーカスがあり、ユーザーが戻るハード ボタンをもう一度押すと、予想される動作はアプリケーションが終了することです。

問題は、B がまだ生きていることを考えると、予期された動作が発生しないことです。BでオーバーライドonBackPressedされたままリッスンし、代わりに他の動作が発生するようにします。

onBackPressedフォーカスが A にあるときにアプリケーションが離れるように、B でオーバーライドされた状態でリッスンを終了するにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

0

Krylez のコメントとして行うことを検討してください。または、Fragmentsを使用することもできます。3.x より古い SDK を対象とする場合は、サポート ライブラリを参照してください。

SDK フォルダー内には、ウィザード スタイルを使用するサンプル プロジェクトがあります。

于 2012-07-28T11:16:12.050 に答える
0

さて、自然な Android ソリューションで問題を解決できました。

Krylez のヒントに従って、FLAG_ACTIVITY_REORDER_TO_FRONT の使用をやめたので、ハード ボタンとの競合がなくなりました。今は、ウィザードを開始するインテントをリサイクルしています。

A には、ユーザーが [続行] ソフト ボタンを押して B に移動したときに呼び出される非常に一般的なメソッドがあります。これ:

    /** Called when the user presses the Continue button*/
public void continueButtonOnClick(View view) {

        Intent intent = this.getIntent();
        intent.setClass(this, StepOneRegisterWizardActivity.class);
        startActivity(intent);
}

アクティビティ B が開始されると、次のように、インテントのエクストラで利用可能なユーザーのデータがあるかどうかを常に確認する必要があります。

    @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);

    getIntentExtras();
}

private void getIntentExtras() {
    Intent intent = this.getIntent();

    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        usernameEditText.setText(bundle.getCharSequence("usernameEditText"));
        passwordEditText.setText(bundle.getCharSequence("passwordEditText"));
    }
}

ここで、おそらく B から、ユーザーは使用可能な (ソフトまたはハードの) 戻るボタンを押して A に戻ります。この場合、次のように、ユーザーのデータを Intent のエクストラに入れる必要があります。

    /** Called when the user presses the Back soft button*/
public void backButtonOnClick(View view) {
    onBackPressed();
}

@Override
/** Called when the user presses the Back hard button*/
public void onBackPressed() {
    finish();

    Intent intent = this.getIntent();
    intent.setClass(this, StepZeroRegisterWizardActivity.class);
    intent.putExtra("usernameEditText", usernameEditText.getText());
    intent.putExtra("passwordEditText", passwordEditText.getText());
    startActivity(intent);
}

最後に、ユーザーがもう一度 [続行] ソフト ボタンを押すと、新しいアクティビティ B にはユーザーが最後に入力したデータが含まれます。

誰かの役に立てば幸いです。

于 2012-07-31T17:10:48.093 に答える