Android 8设备使用DataBinding时应用崩溃,Pre-Oreo设备正常
解决Android 8设备上DataBinding引发的NullPointerException问题
这个问题我之前适配Android Oreo的时候也踩过同款坑,咱们先拆解下问题根源:
问题原因
Android 8(API 26)对Activity窗口的初始化时序做了调整,super.onCreate(savedInstanceState)执行后,窗口的DecorView还没完全完成初始化。这时候调用DataBindingUtil.setContentView(),内部逻辑在尝试获取根ViewGroup时会拿到null,进而触发getChildCount()的空指针异常。而Pre-Oreo设备的DecorView初始化更早,所以不会出现这个问题。
修复方案
推荐直接使用DataBinding自动生成的Binding类来初始化,这种方式更稳定,也能避开时序问题:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getAppComponent().inject(this); // 自动生成的Binding类名称对应布局文件名(比如布局是main_activity.xml,类名就是MainActivityBinding) binding = MainActivityBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); }
如果暂时不想用生成的Binding类,也可以换一种初始化方式:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getAppComponent().inject(this); // 先手动设置布局 setContentView(R.layout.main_activity); // 再绑定根View binding = DataBindingUtil.bind(findViewById(android.R.id.content)); }
额外提示
- 确保你的布局文件有唯一的根布局(不能直接放置多个同级View),否则DataBinding绑定也会出问题。
- 检查gradle配置里是否正确开启DataBinding:
dataBinding { enabled = true },避免生成的Binding类未正确生成。
内容的提问来源于stack exchange,提问作者Farrux Bahodirov
相关产品推荐
相关产品推荐

