在使用Android数据绑定时,应用程序在Android 8上崩溃

14

这段代码可以在Oreo版本之前的设备上正常运行,但是Crashlytics报告说它会在Android 8设备上崩溃。

Translated:

这个代码在oreo版本之前的设备上可以正常工作,但是Crashlytics报告称它会在android 8设备上崩溃。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getAppComponent().inject(this);
        binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
    }

堆栈跟踪

java.lang.NullPointerException: 尝试在空对象引用上调用 'int android.view.ViewGroup.getChildCount()' 的虚拟方法

Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference
       at android.databinding.DataBindingUtil.bindToAddedViews(DataBindingUtil.java:295)
       at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:279)
       at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261)
       at com.myapp.MyActivity.onCreate(MyActivity.java:59)
       at android.app.Activity.performCreate(Activity.java:7174)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
       at android.app.ActivityThread.-wrap11(Unknown Source)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6940)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

你使用的是哪个版本的Android Gradle插件/数据绑定? - pelotasplus
1个回答

17

在8上出现与完全相同的堆栈跟踪导致的崩溃。

您尝试使用过以下方法吗:

binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity, null, false);
setContentView(binding.getRoot());

上面的代码与调用之间的区别

DataBindingUtil.setContentView(...);

这意味着inflate()会直接返回一个View,然后将该视图传递给DataBindingUtils::bindToAddedViews。 在DataBindingUtil.setContentView的情况下,使用以下逻辑:

activity.setContentView(layoutId);
View decorView = activity.getWindow().getDecorView();
ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);

而且看起来

ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);

就是NULL...


1
谢谢你的回答。我偶尔在Android 8上遇到相同的崩溃问题。希望这能解决问题。如果有人需要:binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity_foo, null, false); - Hong
4
关于此事,我们已向谷歌报告:https://issuetracker.google.com/issues/71885063。该问题被标记为“不予修复/无法重现”。开发人员报告称在崩溃报告(crashlytics、Play商店控制台)中看到了这个问题,但很难重现。在我们的应用程序中,这是我们的顶级崩溃报告。 - Carmen
1
有人知道是什么原因导致android.R.id.content不存在吗?我花了几个小时查看AOSP源代码以获取有关如何重现此问题的想法,但仍无法重现它。然而,这是我们最常见的崩溃报告,所以许多用户都会看到它。 - Carmen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接