0

私のアプリは、他のアクティビティのフィールドにユーザーが入力したすべての値を最後に表示する基本的なログイン アプリです。インテント オブジェクトとフラグを使用しています。アクティビティは以下を使用します。

  • Key-Value を保存するインテント エクストラ
  • FLAG_ACTIVITY_FORWARD_RESULT
  • startActivityForResult() および onActivityForResult() メソッド

したがって、AActivity、BActivity、Caactivity という名前のアクティビティとナビゲーション フローは、A → B → C → A で、B と C からの結果である必要があります。

コードのロジックに関する私の理解では、アクティビティ 3 がその結果をアクティビティ 2 を呼び出したアクティビティ (この場合はアクティビティ 1) に転送する必要があることを Android に伝えます。また、アクティビティ 3 が結果を設定して終了すると、アクティビティ 1 の onActivityResult() がアクティビティ 3 から送信された結果データで呼び出されます。

ただし、アプリを実行すると、アクティビティ 3 からのみ結果が得られますが、図に示すように、アクティビティ 1 の TextView に null,null,valueC,valueC として表示されるアクティビティ 2 から null を受け取ります。 画像をクリック

発生した同様の問題をグーグルで検索しましたが、問題を解決できませんでした。

よろしくお願いいたします。

ここに私のコードがあります:

Aアクティビティ:

public class AActivity extends AppCompatActivity {

private static final int REQUEST_CODE = 1;

Button btnStart;
TextView userDetails;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);

    userDetails = (TextView) findViewById(R.id.userdetails);
    btnStart = (Button) findViewById(R.id.btnstart);

    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent activityAIntent = new Intent(AActivity.this, BActivity.class);
            startActivityForResult(activityAIntent, REQUEST_CODE);
        }
    });
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if ((requestCode == REQUEST_CODE) && (resultCode == RESULT_OK)) {

        String return_userName = data.getExtras().getString("username");
        String return_userPassword = data.getExtras().getString("password");
        String return_secretQuestion = data.getExtras().getString("secretquestion");
        String return_secretAnswer = data.getExtras().getString("secretanswer");
        userDetails.setText("Your details: " + return_userName + "," + return_userPassword +
                "," + return_secretQuestion + "," + return_secretAnswer);
    }
}

}

Bアクティビティ:

public class BActivity extends AppCompatActivity {

EditText userName,userPassword;
Button btnCancel,btnNext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);

    userName=(EditText)findViewById(R.id.username);
    userPassword=(EditText)findViewById(R.id.userpassword);
    btnCancel=(Button)findViewById(R.id.btncancel);
    btnNext=(Button)findViewById(R.id.btnnext);

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_back_to_a = new Intent(BActivity.this,AActivity.class);
            startActivity(intent_back_to_a);
        }
    });

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent activityCIntent = new Intent(BActivity.this,CActivity.class);
            activityBIntent.putExtra("username",userName.getText().toString());
            activityBIntent.putExtra("password",userPassword.getText().toString());
            intent_to_c.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
            startActivity(activityBIntent);
            finish();
        }
    });
}

}

Cアクティビティ:

public class CActivity extends AppCompatActivity {

EditText secretQuestion, secretAnswer;
Button btnCancel,btnNext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_c);

    secretQuestion =(EditText)findViewById(R.id.secretquestion);
    secretAnswer =(EditText)findViewById(R.id.secretanswer);
    btnCancel =(Button)findViewById(R.id.btncancel);
    btnNext =(Button)findViewById(R.id.btnnext);

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_back_to_a = new Intent(CActivity.this,AActivity.class);
            startActivity(intent_back_to_a);
        }
    });

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent data = new Intent(CActivity.this,AActivity.class);
            data.putExtra("secretquestion",secretQuestion.getText().toString());
            data.putExtra("secretanswer",secretAnswer.getText().toString());

            setResult(RESULT_OK,data);
            finish();
        }
    });
}

}

4

1 に答える 1

1

見つけた解決策

やあ。最後に、私は自分が間違っていたことを理解しました。したがって、間違いは基本的にアクティビティ C にありました。そこでは、2 から転送されたインテントをキャッチしてエクストラを追加して既存のインテントとマージするのではなく、新しいインテントを作成し、それにエクストラを追加してアクティビティ A に渡しました。

それを変更し、アクティビティ A の onActivirtForResult() メソッドに小さな変更を加えた結果、他のアクティビティから入力されたアクティビティ A のすべての値を完全に取得できるようになりました。

私の解決策が他の人にも役立つことを願っています。したがって、変更は次のとおりです。

Cアクティビティで:

 btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent activityBIntent = getIntent();
            activityBIntent.putExtra("secretquestion",secretQuestion.getText().toString());
            activityBIntent.putExtra("secretanswer",secretAnswer.getText().toString());

            setResult(RESULT_OK,activityBIntent);
            finish();
        }
    });

そしてAActivityで:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case ACTIVITY1:
            if (resultCode == RESULT_OK) {

                String value_username = data.getExtras().getString("username");
                String value_password = data.getExtras().getString("password");
                String value_secretquestion = data.getExtras().getString("secretquestion");
                String value_secretanswer = data.getExtras().getString("secretanswer");
                userDetails.setText(value_username + value_password + value_secretquestion + value_secretanswer);
            }
            break;
    }
}
于 2016-05-22T09:56:14.623 に答える