webdevqa.jp.net

Android data-binding on Android 8を使用するとアプリがクラッシュする

コードはpre-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:nullオブジェクト参照で仮想メソッド '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)
9

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 ..です。

11
pelotasplus