Android应用诊断模块崩溃:EditText空对象引用问题求助
解决诊断模块的NullPointerException崩溃问题
你的崩溃原因非常明确:你在Questions Activity里尝试获取一个属于answers Activity布局的控件,导致findViewById返回null,调用getText()时触发空指针异常。
具体来说:
- 你在
Questions的diagnosispart()方法中调用了findViewById(R.id.textView16),但这个EditText控件是定义在activity_answers.xml布局里的,而Questions加载的是activity_questions.xml,所以找不到这个控件,返回null。 - 同时,你的按钮点击事件里同时调用了
opendiagnosis()和diagnosispart(),这两个方法都会启动answersActivity,不仅重复启动,还会在未验证控件存在的情况下执行获取文本的操作,直接触发崩溃。
修复步骤
1. 修正控件的归属(二选一)
情况A:这个EditText是让用户在Questions页面输入的
如果textView16是需要用户在回答问题时填写的内容,你需要把这个EditText的代码从activity_answers.xml移到activity_questions.xml中,这样Questions Activity就能正确找到它。
情况B:这个EditText是在answers页面显示内容的
如果textView16只是用来在answers页面展示数据的,那你完全不需要在Questions里获取它,直接把要传递的数据通过Intent传给answers即可,在answers里再设置文本。
2. 合并重复的Activity启动逻辑
删除按钮点击事件中重复的方法调用,只保留一个启动逻辑,并整合数据传递。
修改后的代码示例
修正后的Questions Activity代码
public class Questions extends AppCompatActivity { private Button button2; private RadioButton radioButton; private RadioButton radioButton2; private RadioButton radioButton3; private RadioButton radioButton4; private RadioButton radioButton5; private RadioButton radioButton6; private RadioButton radioButton7; private RadioButton radioButton8; private RadioButton radioButton9; private RadioButton radioButton10; private RadioButton radioButton11; private RadioButton radioButton12; private RadioButton radioButton13; private RadioButton radioButton14; private RadioButton radioButton15; private RadioButton radioButton16; private RadioButton radioButton17; private RadioButton radioButton18; // 如果是情况A,声明EditText private EditText inputEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_questions); button2 = findViewById(R.id.button2); // 如果是情况A,初始化EditText inputEditText = findViewById(R.id.textView16); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 验证所有问题是否已回答 boolean shouldStartNextActivity = (radioButton.isChecked() || radioButton2.isChecked()) && (radioButton3.isChecked() || radioButton4.isChecked()) && (radioButton5.isChecked() || radioButton6.isChecked()) && (radioButton7.isChecked() || radioButton8.isChecked()) && (radioButton9.isChecked() || radioButton10.isChecked()) && (radioButton11.isChecked() || radioButton12.isChecked()) && (radioButton13.isChecked() || radioButton14.isChecked()) && (radioButton15.isChecked() || radioButton16.isChecked()) && (radioButton17.isChecked() || radioButton18.isChecked()); if (shouldStartNextActivity){ Intent intent = new Intent(Questions.this, answers.class); // 如果是情况A,传递用户输入的文本 String inputValue = inputEditText.getText().toString(); intent.putExtra("Value1", inputValue); // 如果是情况B,直接传递预设数据或其他逻辑生成的数据 // intent.putExtra("Value1", "this is it"); startActivity(intent); } else{ Toast.makeText(getBaseContext(), "Please answer all the questions for an accurate diagnosis", Toast.LENGTH_LONG).show(); } } }); // 所有RadioButton的初始化代码保持不变 //Question 1 radioButton = findViewById(R.id.radioButton); //yes radioButton2 = findViewById(R.id.radioButton20); //no //Question 2 radioButton3 = findViewById(R.id.radioButton4); //yes radioButton4 = findViewById(R.id.radioButton2); //no //Question 3 radioButton5 = findViewById(R.id.radioButton6); //yes radioButton6 = findViewById(R.id.radioButton5); //no //Question 4 radioButton7 = findViewById(R.id.radioButton7); //yes radioButton8 = findViewById(R.id.radioButton8); //no //Question 5 radioButton9 = findViewById(R.id.radioButton9); //yes radioButton10 = findViewById(R.id.radioButton10); //no //Question 6 radioButton11 = findViewById(R.id.radioButton12); //yes radioButton12 = findViewById(R.id.radioButton11); //no //Question 7 radioButton13 = findViewById(R.id.radioButton13); //yes radioButton14 = findViewById(R.id.radioButton14); //no //Question 8 radioButton15 = findViewById(R.id.radioButton15); //yes radioButton16 = findViewById(R.id.radioButton16); //no //Question 9 radioButton17 = findViewById(R.id.radioButton17); //yes radioButton18 = findViewById(R.id.radioButton18); //no } // 删除原有的opendiagnosis()和diagnosispart()方法,逻辑已整合到点击事件中 @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putBoolean("myOption1", radioButton.isChecked()); savedInstanceState.putBoolean("myOption2", radioButton2.isChecked()); savedInstanceState.putBoolean("myOption3", radioButton3.isChecked()); savedInstanceState.putBoolean("myOption4", radioButton4.isChecked()); savedInstanceState.putBoolean("myOption5", radioButton5.isChecked()); savedInstanceState.putBoolean("myOption6", radioButton6.isChecked()); savedInstanceState.putBoolean("myOption7", radioButton7.isChecked()); savedInstanceState.putBoolean("myOption8", radioButton8.isChecked()); savedInstanceState.putBoolean("myOption9", radioButton9.isChecked()); savedInstanceState.putBoolean("myOption10", radioButton10.isChecked()); savedInstanceState.putBoolean("myOption11", radioButton11.isChecked()); savedInstanceState.putBoolean("myOption12", radioButton12.isChecked()); // 如果是情况A,保存EditText内容 savedInstanceState.putString("inputText", inputEditText.getText().toString()); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); radioButton.setChecked(savedInstanceState.getBoolean("myOption1")); radioButton2.setChecked(savedInstanceState.getBoolean("myOption2")); radioButton3.setChecked(savedInstanceState.getBoolean("myOption3")); radioButton4.setChecked(savedInstanceState.getBoolean("myOption4")); radioButton5.setChecked(savedInstanceState.getBoolean("myOption5")); radioButton6.setChecked(savedInstanceState.getBoolean("myOption6")); radioButton7.setChecked(savedInstanceState.getBoolean("myOption7")); radioButton8.setChecked(savedInstanceState.getBoolean("myOption8")); radioButton9.setChecked(savedInstanceState.getBoolean("myOption9")); radioButton10.setChecked(savedInstanceState.getBoolean("myOption10")); radioButton11.setChecked(savedInstanceState.getBoolean("myOption11")); radioButton12.setChecked(savedInstanceState.getBoolean("myOption12")); // 如果是情况A,恢复EditText内容 inputEditText.setText(savedInstanceState.getString("inputText")); } }
answers Activity代码保持不变(兼容两种情况)
public class answers extends AppCompatActivity { private Button button7; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_answers); Bundle extras = getIntent().getExtras(); if (extras != null) { String value1 = extras.getString("Value1"); if (value1 != null) { TextView displayintentextra = findViewById(R.id.textView16); displayintentextra.setText(value1); } } button7 = findViewById(R.id.button7); button7.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { reset(); } }); } public void reset() { Intent intent = new Intent(this, Questions.class); startActivity(intent); } }
额外建议
- 尽量给控件起有意义的名字,比如把
textView16改成userInputEt或者diagnosisResultTv,这样能避免混淆控件的功能和归属。 - 启动Activity时,使用
当前Activity.this(比如Questions.this)作为Context,避免匿名内部类中Context的潜在问题。
内容的提问来源于stack exchange,提问作者DaMafiaGamer
相关产品推荐
相关产品推荐

