一般情況下,我們一般都在布局xml文件中直接寫頁(yè)面的布局,但有時(shí)需要?jiǎng)討B(tài)改變布局,這時(shí)就需要我們使用Java代碼來實(shí)現(xiàn)了。
改變布局主要是通過改變LayoutParams來實(shí)現(xiàn)的,LayoutParams繼承于Android.View.ViewGroup.LayoutParams。它相當(dāng)于一個(gè)Layout的信息包,封裝了Layout的位置、高、寬等信息。需要注意的是,需要注意到要修改的View的父容器是什么類型的,F(xiàn)rameLayout,LinearLayout,RelativeLayout等,因?yàn)椴煌愋偷腖ayoutParams是不同的。
如果一個(gè)View其父容器為RelativeLayout,若想改變其布局位置,可通過以下代碼實(shí)現(xiàn):
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可傳入不同的布局參數(shù),如addRule(RelativeLayout.BELOW, R.id.XXX); 表示該View位于XXX下面。常用的布局參數(shù)有以下:
layoutParams.alignWithParent = true 如果對(duì)應(yīng)的兄弟元素找不到的話就以父元素做參照物 RelativeLayout.CENTER_HORIZONTAL 在父控件中水平居中 RelativeLayout.CENTER_VERTICAL 在父控件中垂直居中 RelativeLayout.CENTER_IN_PARENT 相對(duì)于父控件完全居中 RelativeLayout.ALIGN_PARENT_BOTTOM 緊貼父控件的下邊緣 RelativeLayout.ALIGN_PARENT_TOP 緊貼父控件的上邊緣 RelativeLayout.ALIGN_PARENT_LEFT緊貼父控件的左邊邊緣 RelativeLayout.ALIGN_PARENT_RIGHT 緊貼父控件的右邊緣 RelativeLayout.ABOVE 在某元素的上方 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.BELOW 在某元素的下方 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.LEFT_OF 在某元素的左邊 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.RIGHT_OF 在某元素的右邊 需要第二個(gè)參數(shù)為 某元素的ID RelativeLayout.ALIGN_TOP 本元素的上邊緣和某元素的的上邊緣對(duì)齊 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.ALIGN_BOTTOM 本元素的上邊緣和某元素的的下邊緣對(duì)齊 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.ALIGN_LEFT 本元素的上邊緣和某元素的的左邊緣對(duì)齊 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.ALIGN_RIGHT 本元素的上邊緣和某元素的的右邊緣對(duì)齊 需要第二個(gè)參數(shù)為某元素的ID RelativeLayout.ALIGN_BASELINE 本元素的基線和某元素的的基線對(duì)齊 需要第二個(gè)參數(shù)為某元素的ID
如果一個(gè)View其父容器為L(zhǎng)inearLayout,若想改變其布局位置,可通過以下代碼實(shí)現(xiàn):
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"/>
若一個(gè)RelativeLayout或LinearLayout要移除其包含的某個(gè)子元素,只需調(diào)用removeView(View view)方法即可。
同樣,若需增加某個(gè)View,可調(diào)用addView方法,這里有一個(gè)層次的概念,對(duì)于一個(gè)ViewGroup,其為它的所有子元素都標(biāo)識(shí)了一個(gè)index,這個(gè)index就代表了某個(gè)子元素的所在的層次,一個(gè)ViewGroup的xml布局文件中,從上到下的子元素的index依次為0,1,2······N,例如一個(gè)布局方向?yàn)関ertical的LinearLayout,其子元素從上到下的index就依次為0,1,2······N。若傳入addView的index為小于0的負(fù)數(shù),如-1,則默認(rèn)index為N + 1,即加在了LinearLayout的最底部。