一般情况下,我们一般都在布局xml文件中直接写页面的布局,但有时需要动态改变布局,这时就需要我们使用Java代码来实现了。
改变布局主要是通过改变LayoutParams来实现的,LayoutParams继承于Android.View.ViewGroup.LayoutParams。它相当于一个Layout的信息包,封装了Layout的位置、高、宽等信息。需要注意的是,需要注意到要修改的View的父容器是什么类型的,FrameLayout,LinearLayout,RelativeLayout等,因为不同类型的LayoutParams是不同的。
如果一个View其父容器为RelativeLayout,若想改变其布局位置,可通过以下代码实现:
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
View.setLayoutParams(layoutParams);
上述代码与以下xml布局代码作用相同:
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
addRule可传入不同的布局参数,如addRule(RelativeLayout.BELOW, R.id.XXX); 表示该View位于XXX下面。常用的布局参数有以下:
layoutParams.alignWithParent = true 如果对应的兄弟元素找不到的话就以父元素做参照物 RelativeLayout.CENTER_HORIZONTAL 在父控件中水平居中 RelativeLayout.CENTER_VERTICAL 在父控件中垂直居中 RelativeLayout.CENTER_IN_PARENT 相对于父控件完全居中 RelativeLayout.ALIGN_PARENT_BOTTOM 紧贴父控件的下边缘 RelativeLayout.ALIGN_PARENT_TOP 紧贴父控件的上边缘 RelativeLayout.ALIGN_PARENT_LEFT紧贴父控件的左边边缘 RelativeLayout.ALIGN_PARENT_RIGHT 紧贴父控件的右边缘 RelativeLayout.ABOVE 在某元素的上方 需要第二个参数为某元素的ID RelativeLayout.BELOW 在某元素的下方 需要第二个参数为某元素的ID RelativeLayout.LEFT_OF 在某元素的左边 需要第二个参数为某元素的ID RelativeLayout.RIGHT_OF 在某元素的右边 需要第二个参数为 某元素的ID RelativeLayout.ALIGN_TOP 本元素的上边缘和某元素的的上边缘对齐 需要第二个参数为某元素的ID RelativeLayout.ALIGN_BOTTOM 本元素的上边缘和某元素的的下边缘对齐 需要第二个参数为某元素的ID RelativeLayout.ALIGN_LEFT 本元素的上边缘和某元素的的左边缘对齐 需要第二个参数为某元素的ID RelativeLayout.ALIGN_RIGHT 本元素的上边缘和某元素的的右边缘对齐 需要第二个参数为某元素的ID RelativeLayout.ALIGN_BASELINE 本元素的基线和某元素的的基线对齐 需要第二个参数为某元素的ID
如果一个View其父容器为LinearLayout,若想改变其布局位置,可通过以下代码实现:
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
View.setLayoutParams(layoutParams);
上述代码与以下xml布局代码作用相同:
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
若一个RelativeLayout或LinearLayout要移除其包含的某个子元素,只需调用removeView(View view)方法即可。
同样,若需增加某个View,可调用addView方法,这里有一个层次的概念,对于一个ViewGroup,其为它的所有子元素都标识了一个index,这个index就代表了某个子元素的所在的层次,一个ViewGroup的xml布局文件中,从上到下的子元素的index依次为0,1,2······N,例如一个布局方向为vertical的LinearLayout,其子元素从上到下的index就依次为0,1,2······N。若传入addView的index为小于0的负数,如-1,则默认index为N + 1,即加在了LinearLayout的最底部。