前言
大多數(shù)時(shí)候我們布局都是用xml來(lái)布局的,但有些時(shí)候也是會(huì)用到動(dòng)態(tài)布局的憨颠,尤其是在一些大項(xiàng)目中胖翰,動(dòng)態(tài)布局更是體現(xiàn)的淋漓盡致帕膜。
所以今天我們就來(lái)學(xué)習(xí)一些動(dòng)態(tài)加添布局的兩種方式,分別是
-
動(dòng)態(tài)添加xml布局
- 另外寫一個(gè)xml布局拦宣,然后通過(guò)java的方式讓他加載他主布局上
-
動(dòng)態(tài)添加java布局
- 通過(guò)java寫出一個(gè)布局截粗,然后再通過(guò)java的方式讓他加載他主布局上
一、動(dòng)態(tài)添加xml布局
步驟
第一步構(gòu)造容器
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
第二步構(gòu)造xml文件
這里我們就主布局添加個(gè)button就可以了鸵隧,用來(lái)點(diǎn)擊加載xml布局绸罗,被添加布局里面我就寫一個(gè)TextView,由于比較簡(jiǎn)單這里就不貼了
第三步構(gòu)造LayoutInflater
提到addview豆瘫,首先要了解一下LayoutInflater類珊蟀。這個(gè)類最主要的功能就是實(shí)現(xiàn)將xml表述的layout轉(zhuǎn)化為View的功能。為了便于理解外驱,我們可以將它與findViewById()作一比較育灸,二者都是實(shí)例化某一對(duì)象,不同的是findViewById()是找xml布局文件下的具體widget控件實(shí)例化昵宇,而LayoutInflater找res/layout/下的xml布局文件來(lái)實(shí)例化的磅崭。
而LayoutInflater有三種方式
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);或
LayoutInflater inflater = LayoutInflater.from(Activity.this);或
LayoutInflater inflater = getLayoutInflater();
這三種方法本質(zhì)是相同的。
第四步inflate()加載布局
用LayoutInflater.inflate() 將LayOut文件轉(zhuǎn)化成VIew趟薄。
View view = inflater.inflate(R.layout.block_gym_album_list_item, null);
this.addContentView(view,lp);
關(guān)于第一步顯示布局的詳細(xì)介紹
改變布局主要是通過(guò)改變LayoutParams來(lái)實(shí)現(xiàn)的绽诚,LayoutParams繼承于Android.View.ViewGroup.LayoutParams。它相當(dāng)于一個(gè)Layout的信息包,封裝了Layout的位置恩够、高卒落、寬等信息。需要注意的是蜂桶,需要注意到要修改的View的父容器是什么類型的儡毕,F(xiàn)rameLayout,LinearLayout扑媚,RelativeLayout等腰湾,因?yàn)椴煌愋偷腖ayoutParams是不同的。
上述代碼與以下xml布局代碼作用相同:
<LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
</LinearLayout>
改變布局位置
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
二、動(dòng)態(tài)添加java布局
我們這里還是以TextView為例旬痹,其實(shí)動(dòng)態(tài)添加java布局和xml布局有異曲同工之處附井,無(wú)非就是用java的方式寫出控件,然后添加進(jìn)布局里
第一步構(gòu)造容器
和上面xml布局的一樣两残,所以這里就不貼了
第二步構(gòu)造控件布局框架
其實(shí)和xml的第二步也是一樣的永毅,只不過(guò)xml已經(jīng)寫好了最外層的布局,所以我們也要用java寫出一個(gè)布局人弓,好在里面放控件
LinearLayout view = new LinearLayout(this);
view.setLayoutParams(lp);//設(shè)置布局參數(shù)
view.setOrientation(LinearLayout.HORIZONTAL);// 設(shè)置子View的Linearlayout// 為垂直方向布局
//定義子View中兩個(gè)元素的布局
ViewGroup.LayoutParams vlp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
第三步添加控件
其實(shí)這一步也沒(méi)有什么好講的沼死,就是xml添加控件的方式改成java添加
TextView tv1 = new TextView(this);
tv1.setLayoutParams(vlp);//設(shè)置TextView的布局
tv1.setText("姓名:");
第四部將控件添加至容器
view.addView(tv1);//將TextView 添加到子View 中