Java LayoutParams类型在运行时已更改。ClassCastException:ViewGroup$LayoutParams不能强制转换为ViewGroup$MarginLayoutParams

Java LayoutParams类型在运行时已更改。ClassCastException:ViewGroup$LayoutParams不能强制转换为ViewGroup$MarginLayoutParams,java,android,android-layout,kotlin,Java,Android,Android Layout,Kotlin,我尝试以编程方式设置布局参数。在onCreate方法中的片段中,我设置了ScrollView的LayoutParams,它就工作了。但是,我还有一个观察者,在这个观察者中,当某些条件为真时,我再次更改这个滚动视图的布局参数。但问题是onCreate中的相同代码在观察者中不起作用。下面是当我设置布局参数并设置观察者时,onCreate方法的一个片段。更改布局参数的方法是复制粘贴的,所以它为什么工作有点奇怪,而一毫秒后就没有了 onCreate: Log.d("Setting height

我尝试以编程方式设置布局参数。在
onCreate
方法中的片段中,我设置了
ScrollView
的LayoutParams,它就工作了。但是,我还有一个观察者,在这个观察者中,当某些条件为真时,我再次更改这个
滚动视图的布局参数。但问题是
onCreate
中的相同代码在观察者中不起作用。下面是当我设置布局参数并设置观察者时,
onCreate
方法的一个片段。更改布局参数的方法是复制粘贴的,所以它为什么工作有点奇怪,而一毫秒后就没有了

onCreate:

Log.d("Setting height in onCreate method")
binding.scrollRoot.layoutParams = ViewGroup.LayoutParams(
    ViewGroup.LayoutParams.MATCH_PARENT,
    binding.txtCars.lineHeight * SIZE + 10
)


cars.observe(viewLifecycleOwner, Observer {
    if (it.size < SIZE)
    {
        Log.d("Setting height in observer method")
        binding.scrollRoot.layoutParams = ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            binding.txtCars.lineHeight * (it.size) + 10
        )
    }
    binding.txtCars.text = formatCars(it, requireContext())
})
D/AppDebug: Setting height in onCreate method
D/AppDebug: Setting height in observer method
I/zygote64: Method exceeds compiler instruction limit: 25337 in void org.ccil.cowan.tagsoup.HTMLSchema.<init>()
D/AndroidRuntime: Shutting down ViewModel
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fuelmanager, PID: 8034
    java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6662)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22216)
        at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22216)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1156)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1539)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:823)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:702)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:831)
        at android.view.View.measure(View.java:22216)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2596)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1638)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1892)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1522)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7292)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:981)
        at android.view.Choreographer.doCallbacks(Choreographer.java:790)
        at android.view.Choreographer.doFrame(Choreographer.java:721)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:967)
        at android.os.Handler.handleCallback(Handler.java:808)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7529)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
它是有效的


但是我的问题是
ViewGroup
/
ScrollView
LayoutParams的类型如何可能发生变化。
onCrete()之后发生了什么,导致观察者出现了这个错误?

当向
视图组添加带有预定义
LayoutParams
视图时,执行检查以确保
LayoutParams
是兼容类型。如果不是,它将被调整,或替换为默认的
LayoutParams
。当您在
onCreate()
中的
ScrollView
(我假设是根)上设置
LayoutParams
时,
ScrollView
尚未添加到其父级,因此
LayoutParams
得到“修复”。但是,之后不会进行此类检查,因此当您稍后设置不兼容的类型时,会出现该异常。
Log.d("Setting height in observer method")
val layoutParams = binding.scrollRoot.layoutParams
layoutParams.height = binding.txtCars.lineHeight * (it.size) + 10