修改CoordinatorLayout内LinearLayout的marginEnd时类型转换报错求助
解决CoordinatorLayout子View LayoutParams类型转换错误的问题
嗨,这个问题我之前也踩过坑!你遇到的android.widget.LinearLayout$LayoutParams cannot be cast to android.support.design.widget.CoordinatorLayout$LayoutParams错误,核心原因其实很直白:子View的LayoutParams类型是由它的直接父容器决定的。你的LinearLayout是嵌套在CoordinatorLayout里面的,所以它的LayoutParams本质是CoordinatorLayout.LayoutParams,而非LinearLayout.LayoutParams,强行转换自然会报错。
具体修改方案:
- 替换LayoutParams类型:把代码里的
LinearLayout.LayoutParams换成CoordinatorLayout.LayoutParams - 应用修改后的参数:修改完margin值后,必须调用
setLayoutParams()把新参数重新设置给View,否则修改不会生效 - 确认类导入正确:确保代码中导入了
android.support.design.widget.CoordinatorLayout(如果是AndroidX项目,对应类为com.google.android.material.coordinatorlayout.CoordinatorLayout)
修改后的完整代码:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(contZC != null) { // 替换为父容器对应的LayoutParams类型 CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) contZC.getLayoutParams(); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { params.setMarginEnd(dpToPixels(25)); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { params.setMarginEnd(dpToPixels(5)); } // 关键步骤:将修改后的参数应用到View上 contZC.setLayoutParams(params); } else Log.d("Activity", "contZC = null"); } // 你的dp转像素方法无需修改 private int dpToPixels(int dpValue) { Resources r = getContext().getResources(); int px = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dpValue, r.getDisplayMetrics() ); return px; }
额外提示:
以后再遇到LayoutParams类型转换错误,第一时间看一下目标View的直接父容器是什么,LayoutParams的类型必须和父容器一一对应,就不会再踩这类类型转换的坑啦~
内容的提问来源于stack exchange,提问作者Gian
相关产品推荐
相关产品推荐

