为何使用ViewBinding设置布局会导致显示异常?
这不是Bug,是ViewBinding inflate 方法的正常行为,核心原因是根视图的layout_*属性依赖父容器才能被解析为有效的LayoutParams:
当调用
setContentView(R.layout.activity_main)时,Android系统会自动将布局的根视图附加到Activity的内容容器(DecorView下的ContentFrameLayout),同时根据根视图的layout_*属性(比如你设置的android:layout_height="50dp")生成对应的LayoutParams并应用,因此布局能正常显示50dp高度。而使用
ActivityMainBinding.inflate(layoutInflater)时,这个重载方法等价于inflate(inflater, null, false)——没有指定父容器,也不自动附加到父容器。此时根视图(你的红色LinearLayout)的layout_*属性会被忽略,因为这些属性是给父容器解析用的。后续调用setContentView(binding.root)时,系统会默认给这个根视图设置match_parent的宽高LayoutParams,导致它铺满整个屏幕。
解决方法
调用ViewBinding的inflate方法时,传入Activity的内容容器作为父参数,同时设置attachToParent为false(避免重复添加视图):
// Kotlin示例 val contentView = findViewById<ViewGroup>(android.R.id.content) val binding = ActivityMainBinding.inflate(layoutInflater, contentView, false) setContentView(binding.root)
这样根视图的layout_*属性会被父容器正确解析,你的50dp高度就能正常生效了。
内容的提问来源于stack exchange,提问作者SAC.Aiden

