Android点击Variables按钮跳转错误与空指针异常问题求助
问题根因
- 你观察到的“点击Variables按钮跳转到OverviewActivity”是错觉:实际是VariablesActivity启动时触发崩溃,系统自动回退到Activity栈的前一个界面,因为你Overview页返回时错误新建了HomeActivity实例,栈结构为
Home→Overview→Home,Variables崩溃后回退就显示为Overview页,导致你误判跳转逻辑错误。 - 崩溃的直接原因是VariablesActivity代码逻辑错误:页面刚初始化时RadioGroup默认无选中项,
radioGroup.getCheckedRadioButtonId()返回-1,用这个无效id查找控件得到null对象,调用getText()就触发空指针异常。 - 额外的逻辑缺陷:OverviewActivity点击返回时你调用了
startActivity新建HomeActivity实例,而非结束当前Overview页回到原有Home实例,既造成栈冗余,也会导致原有Home页面的状态丢失。
修复方案
1. 修复OverviewActivity返回逻辑
修改OverviewActivity中返回按钮的点击逻辑,不再新建Home实例,通过结果回调给原有Home页传递启用状态:
public class OverviewActivity extends AppCompatActivity { public Button backBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_overview); backBtn = findViewById(R.id.ov_backButton); backBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 回传结果给上一级HomeActivity Intent intent = new Intent(); intent.putExtra("state", "enable"); setResult(RESULT_OK, intent); // 结束当前Overview页,回到原有Home页 finish(); } }); } }
2. 修复HomeActivity的状态接收逻辑
修改HomeActivity中Overview按钮的启动方式,通过startActivityForResult接收返回的启用状态,移除原有从Intent拿参数的冗余逻辑:
public class HomeActivity extends AppCompatActivity { public Button signOutBtn; public Button overviewBtn; public Button varBtn; FirebaseAuth auth; boolean overviewDone; // 定义请求码用于识别返回结果 private static final int REQUEST_OVERVIEW = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); signOutBtn = findViewById(R.id.signOutBtn); overviewBtn = findViewById(R.id.overviewBtn); varBtn = findViewById(R.id.varBtn); auth = FirebaseAuth.getInstance(); overviewDone = false; // 初始状态Variables按钮不可用 varBtn.setEnabled(false); signOutBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { auth.signOut(); startActivity(new Intent(HomeActivity.this, SignInActivity.class)); finish(); } }); overviewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent overviewBtnIntent = new Intent(HomeActivity.this, OverviewActivity.class); // 带请求码启动Overview页,等待返回结果 startActivityForResult(overviewBtnIntent, REQUEST_OVERVIEW); } }); varBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent varbiesButtonIntent = new Intent(HomeActivity.this, VariablesActivity.class); startActivity(varbiesButtonIntent); Log.i("Variable Button", "Going to Variable Activity"); } }); } // 接收Overview页返回的结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_OVERVIEW && resultCode == RESULT_OK) { if (data != null && "enable".equals(data.getStringExtra("state"))) { overviewDone = true; varBtn.setEnabled(true); } } } }
3. 修复VariablesActivity空指针问题
调整代码逻辑,先判断是否有选中的RadioButton,再获取选中项的值,避免空指针:
public class VariablesActivity extends AppCompatActivity { public RadioGroup radioGroup; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_variables); radioGroup = findViewById(R.id.RadioGroup); // 先获取选中id,判断有效性再取值 int checkedId = radioGroup.getCheckedRadioButtonId(); if(checkedId == -1){ // 无选中项的逻辑 Log.i("Variable Activity", "当前无选中选项"); } else{ String value = ((RadioButton)findViewById(checkedId)).getText().toString(); Log.i("Radio Button Clicked", value); } // 如果需要监听用户选中变化,可额外给RadioGroup设置OnCheckedChangeListener } }
内容的提问来源于stack exchange,提问作者Devon Dunham
相关产品推荐
相关产品推荐

