Android开发新手:使用Intent传递评分触发NullPointerException求助
解决Intent回传数据的NullPointerException问题
嘿,我帮你拆解下你遇到的核心问题,一步步搞定这个崩溃:
问题1:启动MainActivity时的双重错误
你在MainActivity的onCreate里先调用了setTextInTextView(),这里藏了两个坑:
- 先调用
setTextInTextView()再执行setContentView(R.layout.activity_main),这时候布局还没加载,findViewById(R.id.rate)会直接返回null; - 第一次启动
MainActivity时,根本没有任何Intent附加数据传过来,getIntent().getExtras()会返回null,这时候调用extra.getString("key")必然触发空指针异常。
问题2:Activity2回传数据的方式完全错了
你现在在Activity2里用startActivity(i)启动MainActivity,这其实是新建了一个MainActivity实例,根本不是把数据回传给原来的那个页面。正确的做法是用返回结果的方式传递数据。
修复步骤与代码修改
第一步:修正MainActivity的代码
我们要调整方法调用顺序,加上空值判断,并且用startActivityForResult启动Activity2(兼容绝大多数Android版本):
public class MainActivity extends AppCompatActivity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先加载布局,再找控件,这是基础! setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.rate); // 初始化文本,避免空指针 setTextInTextView(); } public void setTextInTextView(){ Bundle extra = getIntent().getExtras(); // 先判断extra是否为空,再取值 if(extra != null){ tv.setText("当前评分:" + extra.getString("key")); } else { // 第一次启动时显示默认提示 tv.setText("暂无评分"); } } public void go(View view) { Intent i = new Intent(MainActivity.this, Activity2.class); // 用startActivityForResult启动,请求码随便设一个,比如100 startActivityForResult(i, 100); } // 接收Activity2返回的结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 匹配请求码和成功的结果状态 if(requestCode == 100 && resultCode == RESULT_OK){ if(data != null){ String rating = data.getStringExtra("key"); tv.setText("当前评分:" + rating); } } } }
第二步:修正Activity2的代码
我们用setResult()返回数据,然后finish()关闭当前页面,回到原来的MainActivity:
public class Activity2 extends AppCompatActivity { RatingBar rb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_2); rb = (RatingBar) findViewById(R.id.rt); } public void submit(View view) { String st = String.valueOf(rb.getRating()); Intent i = new Intent(); // 把评分数据放到Intent里 i.putExtra("key", st); // 设置返回结果为成功,并传递Intent setResult(RESULT_OK, i); // 关闭当前Activity,回到之前的MainActivity finish(); } }
为什么这样改?
- 调整
setContentView和findViewById的顺序,确保控件能被正确找到; - 增加空值判断,避免第一次启动时因无附加数据导致的崩溃;
- 用
startActivityForResult+setResult的组合,实现数据回传给原MainActivity实例,而不是新建页面。
如果你的项目用的是AndroidX且API版本较高,startActivityForResult已经被废弃,可以改用ActivityResultContracts.StartActivityForResult,不过上面的写法在绝大多数场景下都能正常工作。
内容的提问来源于stack exchange,提问作者ANMOL JAIN
相关产品推荐
相关产品推荐

