Android Studio中如何将两个Activity的单选按钮值传递到第三个Activity
Hey there, let's figure out why you're hitting that "no data" error when submitting from Activity3. I've run into similar issues before, so let's break down the common pitfalls and fix this step by step.
First, let's cover the two approaches you tried—Intent chain passing and SharedPreferences—with concrete fixes for the mistakes that usually cause missing data.
Approach 1: Intent Chain Passing (Fixing Your getExtra Issues)
The most common mistake here is not forwarding Activity1's data from Activity2 to Activity3. If you only pass Activity2's value to Activity3, you'll never get Activity1's data. Here's how to do it correctly:
Step 1: Pass Activity1's Radio Value to Activity2
Make sure you grab the selected radio button value when the user clicks to navigate, not in onCreate (since the user hasn't made a choice yet):
// In Activity1, your "next" button click listener buttonNextToActivity2.setOnClickListener(v -> { RadioGroup radioGroup1 = findViewById(R.id.radio_group_activity1); int selectedRadioId = radioGroup1.getCheckedRadioButtonId(); // Handle case where user didn't select anything if (selectedRadioId == -1) { Toast.makeText(this, "Please select an option first!", Toast.LENGTH_SHORT).show(); return; } RadioButton selectedRadio = findViewById(selectedRadioId); String activity1Selection = selectedRadio.getText().toString(); // Pass the value via Intent Intent intent = new Intent(Activity1.this, Activity2.class); intent.putExtra("ACTIVITY1_SELECTION", activity1Selection); startActivity(intent); });
Step 2: Forward Activity1's Data + Pass Activity2's Value to Activity3
In Activity2, you need to hold onto Activity1's data and send it along with your own radio value to Activity3:
// In Activity2, your "next" button click listener buttonNextToActivity3.setOnClickListener(v -> { // First, retrieve Activity1's data from the incoming Intent String activity1Data = getIntent().getStringExtra("ACTIVITY1_SELECTION"); if (activity1Data == null) { Toast.makeText(this, "Failed to get previous step data", Toast.LENGTH_SHORT).show(); return; } // Get Activity2's selected radio value RadioGroup radioGroup2 = findViewById(R.id.radio_group_activity2); int selectedRadioId = radioGroup2.getCheckedRadioButtonId(); if (selectedRadioId == -1) { Toast.makeText(this, "Please select an option first!", Toast.LENGTH_SHORT).show(); return; } RadioButton selectedRadio = findViewById(selectedRadioId); String activity2Selection = selectedRadio.getText().toString(); // Send both values to Activity3 Intent intent = new Intent(Activity2.this, Activity3.class); intent.putExtra("ACTIVITY1_SELECTION", activity1Data); intent.putExtra("ACTIVITY2_SELECTION", activity2Selection); startActivity(intent); });
Step 3: Retrieve Both Values in Activity3's Submit Button
Now you can safely grab both values when the user submits:
// In Activity3, your "submit" button click listener buttonSubmit.setOnClickListener(v -> { String activity1Data = getIntent().getStringExtra("ACTIVITY1_SELECTION"); String activity2Data = getIntent().getStringExtra("ACTIVITY2_SELECTION"); if (activity1Data == null || activity2Data == null) { Toast.makeText(this, "No data found", Toast.LENGTH_SHORT).show(); return; } // Now you can display the data or save to database Toast.makeText(this, "Activity1 choice: " + activity1Data + "\nActivity2 choice: " + activity2Data, Toast.LENGTH_LONG ).show(); // Insert into database here (use your DB helper code) });
Approach 2: SharedPreferences (Fixing Missing Data Issues)
If you're using SharedPreferences, the #1 mistake is forgetting to call apply() or commit() after editing—this means your data never gets saved to disk. Here's the correct flow:
Step 1: Save Activity1's Value to SharedPreferences
// In Activity1's "next" button listener buttonNextToActivity2.setOnClickListener(v -> { RadioGroup radioGroup1 = findViewById(R.id.radio_group_activity1); int selectedRadioId = radioGroup1.getCheckedRadioButtonId(); if (selectedRadioId == -1) { Toast.makeText(this, "Please select an option first!", Toast.LENGTH_SHORT).show(); return; } RadioButton selectedRadio = findViewById(selectedRadioId); String activity1Selection = selectedRadio.getText().toString(); // Save to SharedPreferences SharedPreferences prefs = getSharedPreferences("SurveyData", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("ACTIVITY1_RADIO", activity1Selection); editor.apply(); // DO NOT FORGET THIS LINE! startActivity(new Intent(Activity1.this, Activity2.class)); });
Step 2: Save Activity2's Value to SharedPreferences
// In Activity2's "next" button listener buttonNextToActivity3.setOnClickListener(v -> { RadioGroup radioGroup2 = findViewById(R.id.radio_group_activity2); int selectedRadioId = radioGroup2.getCheckedRadioButtonId(); if (selectedRadioId == -1) { Toast.makeText(this, "Please select an option first!", Toast.LENGTH_SHORT).show(); return; } RadioButton selectedRadio = findViewById(selectedRadioId); String activity2Selection = selectedRadio.getText().toString(); // Save to SharedPreferences SharedPreferences prefs = getSharedPreferences("SurveyData", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("ACTIVITY2_RADIO", activity2Selection); editor.apply(); startActivity(new Intent(Activity2.this, Activity3.class)); });
Step 3: Retrieve Values in Activity3's Submit Button
// In Activity3's "submit" button listener buttonSubmit.setOnClickListener(v -> { SharedPreferences prefs = getSharedPreferences("SurveyData", MODE_PRIVATE); String activity1Data = prefs.getString("ACTIVITY1_RADIO", null); String activity2Data = prefs.getString("ACTIVITY2_RADIO", null); if (activity1Data == null || activity2Data == null) { Toast.makeText(this, "No data found", Toast.LENGTH_SHORT).show(); return; } // Display or save to database Toast.makeText(this, "Activity1 choice: " + activity1Data + "\nActivity2 choice: " + activity2Data, Toast.LENGTH_LONG ).show(); });
Quick Debug Checklist for Your Existing Code
If you still run into issues, double-check these:
- Are you grabbing the radio button value after the user makes a selection (not in
onCreate)? - For Intents: Are your key strings identical (case-sensitive!) across all Activities?
- For SharedPreferences: Did you call
apply()/commit()after editing? - Are you handling cases where the user doesn't select a radio button (which would result in null values)?
内容的提问来源于stack exchange,提问作者hk77798

