Android Studio中点击Submit按钮App崩溃且数据无法传递的问题
个人资料应用崩溃与数据传递问题
这是一款用于熟悉Android Studio的个人资料应用,开发者首次使用Java,开发经验不足。主Activity包含单选按钮、单选组、复选框、TextView、EditText等控件,点击Apply按钮可展示单选按钮和复选框的选择结果;点击Submit按钮本应跳转到第二个界面,展示EditText输入及控件选择的信息,但目前点击Submit时App崩溃,且原本就无法传递EditText数据,修改代码后问题加剧。
Main Activity Java文件
public class MainActivity extends AppCompatActivity { @SuppressLint("SetTextI18n") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); applyButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (cookingbox.isChecked()) { selectedhobby.setText(selectedhobby.getText().toString() + " " + cookingbox.getText().toString()); } if (sportsbox.isChecked()) { selectedhobby.setText(selectedhobby.getText().toString() + " " + sportsbox.getText().toString()); } if (craftbox.isChecked()) { selectedhobby.setText(selectedhobby.getText().toString() + " " + craftbox.getText().toString()); } if (gamebox.isChecked()) { selectedhobby.setText(selectedhobby.getText().toString() + " " + gamebox.getText().toString()); } if (bookbox.isChecked()) { selectedhobby.setText(selectedhobby.getText().toString() + " " + bookbox.getText().toString()); } if (otherbox.isChecked()) { selectedhobby.setText(selectedhobby.getText().toString() + " " + otherbox.getText().toString()); } if (malebutton.isChecked()) { gendertext.setText(malebutton.getText().toString()); } else if (femalebutton.isChecked()) { gendertext.setText(femalebutton.getText().toString()); } } }); submitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent Intent; Intent = new Intent(MainActivity.this, Screen2Activity.class); Intent.putExtra("selectedhobby", ""); Intent.putExtra("editTextText2", ""); Intent.putExtra("editTextText4", ""); Intent.putExtra("editTextText3", ""); Intent.putExtra("gendertext", ""); startActivity(Intent); setContentView(R.layout.screen2); } }); } }
Screen2 Java文件
import androidx.appcompat.app.AppCompatActivity; public class Screen2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.screen2); ; textName = findViewById(R.id.textName); textAge = findViewById(R.id.textAge); textBirthplace = findViewById(R.id.textBirthplace); textHobbies = findViewById(R.id.textHobbies); textGender = findViewById(R.id.textGender); Intent Intent = getIntent(); if (Intent != null) { String editTextText2 = Intent.getStringExtra("editTextText2"); String editTextText4 = Intent.getStringExtra("editTextText4"); String selectedhobby = Intent.getStringExtra("selectedhobby"); String gendertext = Intent.getStringExtra("gendertext"); Integer editTextText3 = Intent.getIntExtra("editTextText3", -1); textName.setText(Log.d("Screen2Activity", "Name : + editTextText2")); textAge.setText(Log.d("Screen2Activity", "Age : + editTextText3")); textBirthplace.setText(Log.d("Screen2Activity", "Birthplace : + editTextText4")); textHobbies.setText(Log.d("Screen2Activity", "Hobbies : + selectedhobby")); textGender.setText(Log.d("Screen2Activity", "Gender : + gendertext")); }
问题分析与修复方案
一、MainActivity核心问题及修复
- 控件未初始化:所有控件未通过
findViewById绑定,直接调用会触发空指针异常(NPE),这是崩溃的主要原因。 - 传递空数据:
putExtra仅传空字符串,未获取EditText和选择控件的实际值。 - 冗余布局调用:
startActivity后调用setContentView完全多余,跳转后当前Activity会被压入栈,无需重复设置布局。 - 变量命名不规范:
Intent Intent类名与变量名重名,易混淆,建议改为Intent intent。
修复后的MainActivity代码:
public class MainActivity extends AppCompatActivity { // 声明控件变量 private Button applyButton, submitButton; private CheckBox cookingbox, sportsbox, craftbox, gamebox, bookbox, otherbox; private RadioButton malebutton, femalebutton; private TextView selectedhobby, gendertext; private EditText editTextText2, editTextText3, editTextText4; @SuppressLint("SetTextI18n") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化所有控件 applyButton = findViewById(R.id.applyButton); submitButton = findViewById(R.id.submitButton); cookingbox = findViewById(R.id.cookingbox); sportsbox = findViewById(R.id.sportsbox); craftbox = findViewById(R.id.craftbox); gamebox = findViewById(R.id.gamebox); bookbox = findViewById(R.id.bookbox); otherbox = findViewById(R.id.otherbox); malebutton = findViewById(R.id.malebutton); femalebutton = findViewById(R.id.femalebutton); selectedhobby = findViewById(R.id.selectedhobby); gendertext = findViewById(R.id.gendertext); editTextText2 = findViewById(R.id.editTextText2); editTextText3 = findViewById(R.id.editTextText3); editTextText4 = findViewById(R.id.editTextText4); applyButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 清空之前的爱好文本,避免重复追加 selectedhobby.setText(""); StringBuilder hobbies = new StringBuilder(); if (cookingbox.isChecked()) hobbies.append(cookingbox.getText()).append(" "); if (sportsbox.isChecked()) hobbies.append(sportsbox.getText()).append(" "); if (craftbox.isChecked()) hobbies.append(craftbox.getText()).append(" "); if (gamebox.isChecked()) hobbies.append(gamebox.getText()).append(" "); if (bookbox.isChecked()) hobbies.append(bookbox.getText()).append(" "); if (otherbox.isChecked()) hobbies.append(otherbox.getText()).append(" "); selectedhobby.setText(hobbies.toString().trim()); // 设置性别 if (malebutton.isChecked()) { gendertext.setText(malebutton.getText().toString()); } else if (femalebutton.isChecked()) { gendertext.setText(femalebutton.getText().toString()); } else { gendertext.setText(""); } } }); submitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, Screen2Activity.class); // 传递实际数据 intent.putExtra("selectedhobby", selectedhobby.getText().toString()); intent.putExtra("name", editTextText2.getText().toString()); intent.putExtra("birthplace", editTextText4.getText().toString()); // 处理年龄输入的数字转换 try { int age = Integer.parseInt(editTextText3.getText().toString()); intent.putExtra("age", age); } catch (NumberFormatException e) { intent.putExtra("age", -1); // 标记无效年龄 } intent.putExtra("gender", gendertext.getText().toString()); startActivity(intent); } }); } }
二、Screen2Activity核心问题及修复
- 缺少Intent导入:未导入
android.content.Intent,会编译报错。 - 控件未声明:
textName等控件未声明变量,直接赋值会报错。 - Log使用错误:
Log.d()返回int类型日志优先级,不能直接传给setText(),会触发类型转换异常。 - 字符串拼接错误:
"Name : + editTextText2"未实际拼接变量值,仅把符号和变量名当成字符串内容。 - 代码未闭合:
if块和onCreate方法缺少闭合括号。
修复后的Screen2Activity代码:
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.util.Log; import android.widget.TextView; public class Screen2Activity extends AppCompatActivity { private TextView textName, textAge, textBirthplace, textHobbies, textGender; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.screen2); // 初始化控件 textName = findViewById(R.id.textName); textAge = findViewById(R.id.textAge); textBirthplace = findViewById(R.id.textBirthplace); textHobbies = findViewById(R.id.textHobbies); textGender = findViewById(R.id.textGender); Intent intent = getIntent(); if (intent != null) { String name = intent.getStringExtra("name"); String birthplace = intent.getStringExtra("birthplace"); String hobbies = intent.getStringExtra("selectedhobby"); String gender = intent.getStringExtra("gender"); int age = intent.getIntExtra("age", -1); // 设置文本并处理空值/无效数据 textName.setText("Name : " + (name != null ? name : "未输入")); textAge.setText(age != -1 ? "Age : " + age : "Age : 无效输入"); textBirthplace.setText("Birthplace : " + (birthplace != null ? birthplace : "未输入")); textHobbies.setText("Hobbies : " + (hobbies != null && !hobbies.isEmpty() ? hobbies : "未选择")); textGender.setText("Gender : " + (gender != null && !gender.isEmpty() ? gender : "未选择")); // 单独输出日志 Log.d("Screen2Activity", "Name : " + name); Log.d("Screen2Activity", "Age : " + age); Log.d("Screen2Activity", "Birthplace : " + birthplace); Log.d("Screen2Activity", "Hobbies : " + hobbies); Log.d("Screen2Activity", "Gender : " + gender); } } }
三、额外注意事项
- 确保布局文件中所有控件ID与代码里
findViewById的参数完全一致。 - 年龄输入框可在布局设置
inputType="number",限制用户输入数字,减少异常。 - 建议用RadioGroup管理性别单选按钮,可直接获取选中项,无需逐个判断。
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

