前言
开发中经常遇到一个场景,动态给View设置margin 边距,针对容器类布局(ViewGroup及子类)比较直观。对于非容器类进行margin设置需要按照规则进行设置,否则很容造成类型转换异常
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot
be cast to android.widget.RelativeLayout$LayoutParams
为什么给父布局(RelativeLayout)下的子 View(ImamgeView) 设置 LinearLayout.LayoutParams ,提示类型转换异常?
设置ImageView的 LayoutParams需要从 LayoutParams 的子类选择一个。然后并没有针对View的 LayoutParams.比如:
ImageView.LayoutParams TextView.LayoutParams
LayoutParams 的子类:
ViewGroup.MarginLayoutParams
FrameLayout.LayoutParams
LinearLayout.LayoutParams
RelativeLayout.LayoutParams
RecyclerView.LayoutParams
GridLayoutManager.LayoutParams
StaggeredGridLayoutManager.LayoutParams
ViewPager.LayoutParams
WindowManager.LayoutParams
继承关系
xxxLayout.LayoutParams -> ViewGroup.MarginLayoutParams-> ViewGroup.LayoutParams
view类中方法setLayoutParams()入参要求必须是 ViewGroup.LayoutParams及子类。
public void setLayoutParams(ViewGroup.LayoutParams params) {
if (params == null) {
throw new NullPointerException("Layout parameters cannot be null");
}
mLayoutParams = params;
resolveLayoutParams();
if (mParent instanceof ViewGroup) {
((ViewGroup) mParent).onSetLayoutParams(this, params);
}
requestLayout();
}
public void setLayoutParams(ViewGroup.LayoutParams params)。
翻译: 设置与此视图关联的布局参数。这些为该视图的 parent 提供参数, 指定它应该如何排列。 ViewGroup.LayoutParams 有很多子类,它们对应 着不同的 ViewGroup 子类,它们负责安排他们的子类。 @param params 该视图的布局参数,不能为空
之所以设置View 的 LayoutParams,需要使用View的父容器的 LayoutParams,因为父容器中定义类静态内部类 LayoutParams。子View 需要传递LayoutParams告知父布局如何进行布局。
marginHorizontal,marginVertical
2. ViewGroup中MarginLayoutParams 静态类中有包含两个属性 marginHorizontal,marginVertical。
marginHorizontal,设置左右margin,marginVertical设置垂直margin。优先级高于 leftMargin,rightMargin,topMargin,
引用地址 Android LayoutParams详解
|