如何使用Kotlin设置GridLayout的gravity属性?调用setGravity崩溃如何解决?
GridLayout设置gravity崩溃解决方案
崩溃根因
你的代码存在两个核心错误,直接导致运行崩溃:
- 用错了LayoutParams类型:
GridLayout.LayoutParams是专门用于GridLayout的子View的布局参数类,你将它赋值给GridLayout自身的layoutParams属性,GridLayout的父容器无法识别该参数类型,会直接抛出ClassCastException异常。 - 混淆了属性概念:
gravity是控件内部内容的对齐规则,layout_gravity是控件自身在父容器中的对齐规则,两类属性的设置方式完全不同,你需要先明确自己的需求场景选择对应设置方法。
正确设置方法
场景1:设置GridLayout内部子元素的对齐规则(对应XMLandroid:gravity属性)
无需修改LayoutParams,直接调用GridLayout自身的gravity属性即可:
private fun sizefix(view : View) { val gridlyt : GridLayout = view.findViewById(R.id.gridlayout) // 直接设置GridLayout自身的gravity,控制内部子元素对齐 gridlyt.gravity = Gravity.CENTER }
场景2:设置GridLayout自身在父容器中的对齐规则(对应XMLandroid:layout_gravity属性)
需要使用GridLayout父容器对应的LayoutParams类型,且建议先获取已有LayoutParams再修改,避免覆盖XML中配置的宽高、边距等属性:
示例为GridLayout父容器是LinearLayout的情况,若父容器是ConstraintLayout/FrameLayout等,替换为对应容器的LayoutParams类即可
private fun sizefix(view : View) { val gridlyt : GridLayout = view.findViewById(R.id.gridlayout) // 先获取GridLayout已有的布局参数,再做修改 val param = gridlyt.layoutParams as LinearLayout.LayoutParams param.gravity = Gravity.CENTER gridlyt.layoutParams = param }
注意事项
- 不要直接实例化空的LayoutParams对象赋值给View,空构造生成的参数会覆盖XML中配置的所有布局属性,容易引发布局错乱。
- 所有View的
layoutParams类型都和它的直接父容器对应,和View自身类型无关,不要用错参数类。
内容的提问来源于stack exchange,提问作者prafful bharti
相关产品推荐
相关产品推荐

