Fragment调用MainActivity方法遇空指针,求非Bundle实现方案
问题:Fragment调用MainActivity方法触发NullPointerException的原因及解决方案
问题场景代码
Fragment中的方法:
private void getDataFromMainActivity(String object) { MainActivity mainActivity = new MainActivity(); List<ModelData> newDataList = mainActivity.getDataForTab(object); callAdapter(newDataList); progressBar.setVisibility(View.GONE); }
MainActivity中的方法:
public List<ModelData> getDataForTab(String object) { return allData.get(object); }
运行时抛出NullPointerException,MainActivity内部打印allData不为空,但Fragment中调用时始终返回null。
原因分析
你在Fragment里通过new MainActivity()创建了一个全新的MainActivity实例,这个实例和当前正在运行的、已经初始化好allData的MainActivity完全是两个独立对象。新创建的Activity既没有经过系统的生命周期初始化流程,也没有填充过allData数据,所以调用getDataForTab时返回null,进而触发空指针异常。
不使用Bundle的解决方案
Fragment依附于Activity存在,正确的做法是获取当前绑定的已运行的MainActivity实例,而非新建对象:
修改Fragment中的方法:
private void getDataFromMainActivity(String object) { // 安全获取当前关联的MainActivity实例 if (requireActivity() instanceof MainActivity) { MainActivity mainActivity = (MainActivity) requireActivity(); List<ModelData> newDataList = mainActivity.getDataForTab(object); // 建议加非空判断,避免后续callAdapter处理空列表 if (newDataList != null) { callAdapter(newDataList); } progressBar.setVisibility(View.GONE); } }
补充说明
requireActivity()是Fragment的API,会返回当前绑定的Activity实例,如果Fragment未绑定则抛出异常,比getActivity()更严谨;- 加
instanceof判断是为了避免类型转换异常,确保当前Fragment确实依附于MainActivity; - 额外增加
newDataList的非空判断,可以进一步避免后续逻辑出现空指针。
内容的提问来源于stack exchange,提问作者Andro
相关产品推荐
相关产品推荐

