Передача статистических данных между действиями и перенаправление их на одно действие
Мое приложение представляет собой базовое приложение для входа в систему, которое в конце представит все значения, введенные пользователем для полей в других действиях. Я работаю с объектами намерений и флагами. Деятельность использует:
- намерение дополнений для хранения ключей-значений,
- FLAG_ACTIVITY_FORWARD_RESULT
- Методы startActivityForResult() и onActivityForResult()
Таким образом, действия, названные AActivity, BActivity, Caactivity и навигационным потоком, должны быть: A → B → C → A с результатами B и C.
Мое понимание логики кода заключается в том, что это говорит Android, что действие 3 должно перенаправить свой результат обратно в действие, которое называется действием 2, в данном случае это действие 1. А также, когда операция 3 устанавливает свой результат и завершает работу, вызывается onActivityResult() в операции 1 с данными результата, отправленными из операции 3.
Однако, когда я запускаю приложение, я получаю результаты только из действия 3, но получаю нулевое значение из действия 2, которое отображается в TextView в действии 1 как null,null,valueC,valueC, как показано на рисунке. нажмите на изображение
Я гуглил и искал похожие возникшие проблемы, но не смог решить проблему.
Заранее спасибо за вашу помощь
Вот мои коды:
AActivity:
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);
}
}
}
BActivity:
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();
}
});
}
}
CActivity:
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();
}
});
}
}
1 ответ
НАЙТИ РЕШЕНИЕ
Привет. Наконец-то я понял, что я делаю не так. Итак, ошибка была в основном в Деятельности C, где я создавал новое намерение и добавлял к нему дополнительные, которые нужно было передать в Активность A, вместо того, чтобы перехватывать перенаправленное намерение из 2 и добавлять дополнительные для слияния с уже существующим намерением.
Изменив его и сделав небольшое изменение в методе onActivirtForResult() Деятельности A, теперь я прекрасно получаю все значения в Деятельности A, введенные из других Деятельностей.
Надеюсь, что мое решение будет полезно и другим. Итак, изменения следующие:
в CActivity:
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;
}
}